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
Jusque la tout marche bien, j'obtiens bien la réponse de mon web service.
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);
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 :
Comment passer mon objet X509Certificate, de plus je ne connais pas le mot de passe du certificat !
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");
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
Partager