Java HttpsURLConnection SSLHandshakeException

Posted

技术标签:

【中文标题】Java HttpsURLConnection SSLHandshakeException【英文标题】: 【发布时间】:2011-10-02 14:58:30 【问题描述】:

我正在尝试使用 HttpsURLConnection 与网站建立 HTTPS 连接,然后执行 PUT 请求。当我尝试从HttpsURLConnection.getOutputStream() 创建OutputStreamWriter 时,会抛出以下异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

该页面刚刚获得其证书(由 StartCom 颁发) - 我是否需要手动执行某些操作以使 Java 识别该证书现在存在?我可以毫无困难地连接到同一网站的其他页面,但它们的证书不同。

【问题讨论】:

【参考方案1】:

您可以使用工具 keytool(来自 JDK)将 StartCom 的根证书导入 Java 密钥库(JKS),然后将密钥库设置为“受信任的存储”。

请参阅“导出和导入证书”部分:

http://java.sun.com/developer/technicalArticles/Security/secureinternet2/

那篇文章中提到的命令:

将证书导入trustedcerts.jks:

keytool -import -keystore trustedcerts.jks -alias qusay -file server.crt

使用自定义 tuststore 启动 Java:

java -Djavax.net.ssl.trustStore=trustedcerts.jks com.example.MyClass

或者,您可以在运行时设置信任库:

System.setProperty("javax.net.ssl.trustStore","./trustedcerts.jks");

【讨论】:

谢谢 - 对于有同样问题的其他人,我将证书保存在本地,使用 keytool -import ... 命令并将 System.setProperty("javax.net.ssl.trustStore", "path_to_keystore"); 添加到我的代码中。【参考方案2】:

也请看这个问题:Import StartCom CA certificates in Windows JRE

它链接到一个脚本,用于将 StartCom 证书导入您的 JDK 可信存储。

【讨论】:

以上是关于Java HttpsURLConnection SSLHandshakeException的主要内容,如果未能解决你的问题,请参考以下文章

发生 HttpsURLConnection 400 Bad Request 错误

为啥 HttpsURLConnection.get Server Certificates() 在 Java 6 和 Java7 中返回不同的结果?

关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)

java HttpsURLConnection怎么绕过证书,原理是啥

java HttpsURLConnection怎么绕过证书,原理是啥

Tomcat、HTTP Keep-Alive 和 Java 的 HttpsUrlConnection