我正在使用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
我甚至不确定客户端证书是问题所在。