J'utilise Java 6 et j'essaie de créer un HttpsURLConnection
contre un serveur distant, en utilisant un certificat client.
Le serveur utilise un certificat racine auto-signé et requiert la présentation d'un certificat client protégé par mot de passe. J'ai ajouté le certificat racine du serveur et le certificat client à un keystore java par défaut que j'ai trouvé dans /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Le nom du fichier keystore semble suggérer que le certificat client n'est pas censé y entrer?
Quoi qu'il en soit, l'ajout du certificat racine à ce magasin a résolu le tristement célèbre javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Cependant, je suis maintenant bloqué sur la façon d'utiliser le certificat client. J'ai essayé deux approches et aucune ne m'amène nulle part.
Tout d'abord, et de préférence, essayez:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
J'ai essayé de sauter la classe HttpsURLConnection (pas idéal car je veux parler HTTP avec le serveur), et faites ceci à la place:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
Je ne suis même pas sûr que le certificat client soit le problème ici.