Bonjour,

Je mets en place SSL avec authentification mutuelle sur des web services jax-ws sous Tomcat 5.5, en local sur ma machine Windows.
Grace à des tutos trouvés sur le net, j'ai pu suivre les étapes suivantes :
1) J'ai créé avec keytool un keystore pour le serveur
2) J'ai exporté de ce keystore la clé publique et je l'ai ajouté au truststore java (dans jre\lib\security\cacerts)
3) J'ai créé avec keytool un certificat pour le client
4) J'ai exporté la clé publique de ce certificat et je l'ai ajouté au truststore java (dans jre\lib\security\cacerts)
5) J'ai configuré mon web service en CLIENT-CERT ds le web.xml

Puis dans mon client Java, j'appelle le web service comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
// avoir les logs SSL
System.setProperty("javax.net.debug", "SSL,handshake");
// init du trustore de la JVM
System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files\\Java\\jdk\\jre\\lib\\security\\cacerts");
// init du password du trustore de la JVM
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
// init du certificat client
System.setProperty("javax.net.ssl.keyStore", "D:\\certs\\mycert.jks");
// init du password du certificat client
System.setProperty("javax.net.ssl.keyStorePassword", "mypass");
...
final WSTestImpl proxy = service.getWSTestImplPort();
((BindingProvider) proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://localhost:8443/test-service/WSTest?wsdl");
final String result = proxy.getMessage("toto");
System.out.println("Response : " + result);
Jusque la tout marche bien, j'obtiens bien la réponse de mon web service.
Cependant, dans l'exemple ci-dessus pour mes développements, je récupère le certificat sur mon disque local et je dois fournir le password.
Mais, en réalité, en production, le certificat sera issu d'une carte introduite dans un lecteur de carte et pour laquelle l'utilisateur tape son mot de passe.
C'est-à-dire :
1) l'utilisateur met sa carte dans le lecteur de carte
2) une application installée sur la machine détecte qu'une carte a été introduite ds le lecteur et demande le code PIN (password du certificat).
3) l'application se charge d'installer le certificat dans le magasin Windows.

Donc, dans mon client Java, je dois récupérer le certificat non pas sur le disque mais dans le magasin Windows, ça je sais faire (je récupère un objet X509Certificate).
Mais comment je fais pour les lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
System.setProperty("javax.net.ssl.keyStore", "D:\\certs\\mycert.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "mypass");
Comment passer mon objet X509Certificate, de plus je ne connais pas le mot de passe du certificat !

Qq'un peut-il me dire si c'est possible et comment utiliser un certificat récupéré du magasin et sans connaitre le mot de passe ?
Merci d'avance
Le marlou