Java 6 kullanıyorum ve HttpsURLConnection
bir istemci sertifikası kullanarak uzak bir sunucuya karşı bir oluşturmaya çalışıyorum .
Sunucu, kendinden imzalı bir kök sertifika kullanıyor ve parola korumalı bir istemci sertifikasının sunulmasını gerektiriyor. Sunucu kök sertifikasını ve istemci sertifikasını /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5) içinde bulduğum varsayılan bir java anahtar deposuna ekledim . Anahtar deposu dosyasının adı, istemci sertifikasının oraya girmemesi gerektiğini gösteriyor gibi görünüyor?
Her neyse, bu mağazaya kök sertifika eklemek kötü şöhreti çözdü javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Ancak, şimdi istemci sertifikasını nasıl kullanacağım konusunda takılı kaldım. İki yaklaşımı denedim ve ikisi de beni hiçbir yere götürmedi.
İlk önce ve tercih edilen, şunu deneyin:
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
HttpsURLConnection sınıfını atlamayı denedim (sunucuyla HTTP konuşmak istediğim için ideal değil) ve bunun yerine şunu yap:
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
İstemci sertifikasının burada sorun olduğundan bile emin değilim.