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
  • RSA
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
  • RSA
  • RSA/ECB/PKCS1Padding
Performs RSA encryption and decryption.
KeyStore
  • Windows-MY
  • Windows-ROOT
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
  • Windows-PRNG
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());
}
Be Sociable, Share!