我正在使用Java 6,并试图使用客户端证书针对远程服务器创建HttpsURLConnection
。
服务器正在使用自签名根证书,并要求提供受密码保护的客户端证书。我已将服务器根证书和客户端证书添加到我在/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5)中找到的默认Java密钥库中。 密钥库文件的名称似乎暗示客户端证书不应该进入那里?通过HTTPS/SSL的Java客户端证书
总之,添加根证书到这家店解决了臭名昭著的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
我甚至不确定客户端证书是否是这里的问题。
这看起来像一个非常整洁的软件包,但应该使它工作的类“AuthSSLProtocolSocketFactory”在4.0beta(尽管发行说明中指出它是)或3.1中都不是正式发布的一部分。 我已经绕过它了一下,现在似乎永久卡住了5分钟的挂起,然后才断开连接。这真的很奇怪 - 如果我将CA和客户端证书加载到任何浏览器中,它就会飞走。 – Jan 2009-05-19 11:58:30
Apache HTTP Client 4可以直接使用`SSLContext`,所以你可以这样配置所有这些,而不是使用`AuthSSLProtocolSocketFactory`。 – Bruno 2010-09-14 22:00:26