Я использую Java 6 и пытаюсь создать HttpsURLConnection
для удаленного сервера, используя сертификат клиента.
Сервер использует собственный корневой сертификат и требует наличия защищенного паролем сертификата клиента. Я добавил корневой сертификат сервера и сертификат клиента в хранилище ключей java по умолчанию, которое я нашел в /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5).
Имя файла хранилища ключей, похоже, предполагает, что сертификат клиента не должен туда заходить?
В любом случае добавление корневого сертификата в этот магазин разрешило печально известный javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
Тем не менее, я теперь зациклился на том, как использовать сертификат клиента. Я пробовал два подхода и нигде не доставил меня.
Во-первых, и предпочитайте, попробуйте:
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 (не идеально, так как я хочу поговорить с HTTP с сервером), и вместо этого сделайте следующее:
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
Я даже не уверен, что проблема с сертификатом клиента здесь.