Estou usando o Java 6 e tentando criar um HttpsURLConnection
em um servidor remoto, usando um certificado de cliente.
O servidor está usando um certificado raiz autoassinado e requer a apresentação de um certificado de cliente protegido por senha. Eu adicionei o certificado raiz do servidor e o certificado do cliente a um keystore java padrão que encontrei em /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). O nome do arquivo de armazenamento de chave parece sugerir que o certificado do cliente não deve ir lá.
De qualquer forma, adicionar o certificado raiz a esta loja resolveu o infame javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
No entanto, agora estou sem saber como usar o certificado do cliente. Tentei duas abordagens e nenhuma me levou a lugar nenhum.
Primeiro, e de preferência, tente:
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
Tentei pular a classe HttpsURLConnection (não é o ideal, pois quero falar HTTP com o servidor) e, em vez disso:
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
Eu nem tenho certeza se o certificado do cliente é o problema aqui.