Saya menggunakan Java 6 dan mencoba membuat HttpsURLConnection
server jauh melawan, menggunakan sertifikat klien.
Server menggunakan sertifikat akar yang ditandatangani sendiri, dan mengharuskan sertifikat klien yang dilindungi sandi disajikan. Saya telah menambahkan sertifikat root server dan sertifikat klien ke keystore java default yang saya temukan di /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5). Nama file keystore sepertinya menyarankan bahwa sertifikat klien tidak seharusnya masuk ke sana?
Bagaimanapun, menambahkan sertifikat root ke toko ini menyelesaikan masalah yang terkenal itu javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Namun, saya sekarang terjebak pada cara menggunakan sertifikat klien. Saya sudah mencoba dua pendekatan dan tidak membawa saya kemana-mana.
Pertama, dan lebih disukai, coba:
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
Saya telah mencoba melewatkan kelas HttpsURLConnection (tidak ideal karena saya ingin berbicara tentang HTTP dengan server), dan melakukan ini sebagai gantinya:
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
Saya bahkan tidak yakin bahwa sertifikat klien adalah masalahnya di sini.