Używam Java 6 i próbuję utworzyć HttpsURLConnection
przeciwko zdalnemu serwerowi, używając certyfikatu klienta.
Serwer używa certyfikatu głównego z podpisem własnym i wymaga przedstawienia certyfikatu klienta chronionego hasłem. Dodałem certyfikat główny serwera i certyfikat klienta do domyślnego magazynu kluczy java, który znalazłem w /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Nazwa pliku kluczy wydaje się sugerować, że certyfikat klienta nie powinien tam być umieszczony?
W każdym razie dodanie certyfikatu głównego do tego sklepu rozwiązało niesławny javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Jednak teraz utknąłem na tym, jak używać certyfikatu klienta. Wypróbowałem dwa podejścia i żadne mnie nie prowadzi.
Najpierw i najlepiej spróbuj:
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
Próbowałem pominąć klasę HttpsURLConnection (nie jest to idealne rozwiązanie, ponieważ chcę rozmawiać z serwerem HTTP) i zamiast tego robię to:
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
Nie jestem nawet pewien, czy problem dotyczy certyfikatu klienta.