Description
Cet article fait suite à « Signer un document PDF en Java »
J’ai poursuivi mes recherches pour utiliser directement les certificats présents dans le magasin de Microsoft Windows . Je recherchais principalement à utiliser un certificat présent sur une carte à puce (utilisée pour l’authentification sur le poste) or ce certificat est poussé à la connexion de l’utilisateur dans le magasin de certificats personnels de Windows.
Avec ces recherches j’ai découvert qu’à partir de la version 6 de Java il est très simple d’utiliser l’API MSCAPI. En effet Java SE 6 propose un large choix d’outils et il est préconfiguré avec la plupart des « providers » dont le SunMSCAPI Provider (voir $JRE_HOME/lib/security/java.security ).
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI
Services supportés par SunMSCAPI
Type |
Name |
Description |
KeyPairGenerator |
|
Generates RSA key pairs needed by other cryptographic services such as Signature and Cipher. |
Signature |
- SHA1withRSA
- MD5withRSA
- MD2withRSA
|
Creates and validates signatures using various message digest and encryption algorithm as specified in the service name. |
Cipher |
|
Performs RSA encryption and decryption. |
KeyStore |
|
Provides direct read-write access to MS Window’s keystores. The Windows-MY keystore contains the user’s private keys and the associated certificate chains. The Windows-ROOT keystore contains all root CA certificates trusted by the machine. |
SecureRandom |
|
Generates random numbers for the random data that other cryptographic services need. |
Attention : J’ai remarqué en utilisant cette API que le code PIN de la carte à puce est re-demandé même s’il est fourni dans l’application (cela doit être un bug des drivers du lecteur de carte)
Exemple
try {
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null) ;
java.util.Enumeration en = ks.aliases() ;
while (en.hasMoreElements()) {
String aliasKey = (String)en.nextElement() ;
Certificate c = ks.getCertificate(aliasKey) ;
System.out.println("---> alias : " + sss) ;
System.out.println(" Certificat : " + c.toString() ) ;
if (aliasKey.equals("myKey") ) {
PrivateKey key = (PrivateKey)ks.getKey(aliasKey, "monPassword".toCharArray());
Certificate[] chain = ks.getCertificateChain(aliasKey);
}
}
} catch (Exception ioe) {
System.err.println(ioe.getMessage());
} |
Voir aussi
http://java.sun.com/developer/technicalArticles/J2SE/security/
http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html
Très bonne découverte. C’est super pratique au niveau de l’utilisation d’application.
Mais une petite question, as-tu réussi à l’utiliser avec Bouncy Castle?
Je vais regarder si j’ai testé cela (avec Bouncy Castle). Si c’est le cas je l’ai fais dans le cadre de la signature d’un document PDF.
Car il y a quand même une particularité avec ce provider, c’est que l’on ne peut pas accéder à la clé privé de l’utilisateur.
Du coup, tous les calculs sont réalisés par les API Windows…
Du coup, très curieux de savoir si Bouncy Castle fonctionne. Merci pour les conseils…
bizarre cette ligne:
System.out.println(« —> alias : » + sss) ;
Oui j’ai essayé de donner des noms de variables plus parlant en ecrivant le code dans l’article mais j’ai oublie de corriger cela.
C’est bien sur
System.out.println( « —> alias : » +aliasKey) ;
Ajouter une réponse