基于 HTTPS/SSL 的 Java 客户端证书
我正在使用Java 6,并尝试使用客户端证书针对远程服务器创建一个。
服务器使用自签名的根证书,并要求提供受密码保护的客户端证书。我已将服务器根证书和客户端证书添加到我在(OSX 10.5)中找到的默认java密钥库。密钥库文件的名称似乎表明客户机证书不应该进入那里?HttpsURLConnection
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
无论如何,将根证书添加到此存储中解决了臭名昭着的问题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
我甚至不确定客户端证书是否是这里的问题所在。