Je suis à l'aide de Java 6 et je suis en train de créer un HttpsURLConnection
sur un serveur distant, à l'aide d'un certificat client.
Le serveur est à l'aide d'un autosignés certificat racine, et nécessite un mot de passe protégé certificat client est présenté. J'ai ajouté le certificat racine du serveur et le certificat du client pour un java par défaut du fichier de clés que j'ai trouvé, en /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5).
Le nom du fichier de magasin de clés semble suggérer que le certificat du client n'est pas censé y aller?
De toute façon, ajouter le certificat racine de ce magasin résolu le tristement célèbre javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Cependant, je suis maintenant coincé sur la façon d'utiliser le certificat client. J'ai essayé les deux approches et obtient ni moi n'importe où.
Tout d'abord, et préféré, 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 le HttpsURLConnection classe (pas l'idéal, car je veux parler HTTP avec le serveur), et faire 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 est le problème ici.