Sto usando Java 6 e sto cercando di creare un HttpsURLConnection
contro un server remoto, utilizzando un certificato client.
Il server utilizza un certificato radice autofirmato e richiede che venga presentato un certificato client protetto da password. Ho aggiunto il certificato radice del server e il certificato client a un keystore java predefinito che ho trovato in /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Il nome del file keystore sembra suggerire che il certificato client non dovrebbe entrare lì?
Ad ogni modo, l'aggiunta del certificato radice a questo negozio ha risolto il famigerato javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Tuttavia, ora sono bloccato su come utilizzare il certificato client. Ho provato due approcci e nessuno dei due mi porta da nessuna parte.
Innanzitutto, e preferito, prova:
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
Ho provato a saltare la classe HttpsURLConnection (non ideale dato che voglio parlare HTTP con il server), e invece faccio questo:
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
Non sono nemmeno sicuro che il problema qui sia il certificato client.