【发布时间】:2014-01-04 19:32:14
【问题描述】:
我有
- 自签名服务器证书(来自我需要与之通信的第三方组织)
- 我的客户端证书,包含密钥,由该服务器证书签名。
现在我需要使用这些证书通过 HTTPS 发送 POST 请求。 在浏览器中安装它们后,我设法在 Internet Explorer 中通过 https 测试连接:
- 服务器证书 - 进入受信任的 CA
- 客户证书 - 进入个人证书。
到目前为止,在 java 中,我使用了 neu242 的答案中SO: Java client certificates over HTTPS/SSL 中给出的代码,即接受任何证书。但现在服务器端确实接受了这一点,即 SSL 握手失败。
感谢SO: X509TrustManager Override without allowing ALL certs? 我试图返回getAcceptedIssuers 中的服务器证书,但没有成功。它抛出
javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
就在getAcceptedIssuers 返回之后。
public X509Certificate[] getAcceptedIssuers() {
try {
X509Certificate scert;
try (InputStream inStream = new FileInputStream("..\\server.crt")) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
scert = (X509Certificate) cf.generateCertificate(inStream);
}
return new X509Certificate[]{scert};
} catch (Exception ex) {
writeLogFile(ex.getMessage());
return new X509Certificate[]{};
}
}
我想我应该以某种方式指定客户端证书,但找不到任何方法。 当然,我可能错了。
希望有人能指引我正确的方向。
【问题讨论】:
-
握手失败是在客户端还是在服务器端?您可以使用额外的 jvm 参数
-Djavax.net.debug=all同时运行服务器和客户端并共享控制台输出吗?