【问题标题】:java ssl handshake_failure issuejava ssl握手失败问题
【发布时间】:2017-08-02 17:33:54
【问题描述】:

我正在尝试向我们的一个服务器 url 发送请求,但是每当我尝试连接时,我都会得到这个期望

java.net.ConnectException: Received fatal alert: handshake_failure

这是我访问网站时从浏览器获得的证书详细信息。

Common Name (CN)    Go Daddy Secure Certificate Authority - G2
Organisation (O)    GoDaddy.com, Inc.
Organisational Unit (OU)    http://certs.godaddy.com/repository/

我在我的 java 目录中的 cacerts 中检查了相同的详细信息

keytool -list -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/security/cacerts | grep godaddy

godaddyclass2ca, 23 Sep, 2016, trustedCertEntry, 
godaddyrootcertificateauthority-g2, 23 Sep, 2016, trustedCertEntry,

这是安装的java版本:

openjdk version "1.8.0_101"
OpenJDK Runtime Environment (build 1.8.0_101-b13)
OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)

我什至从浏览器下载了证书并将其导入cacerts

keytool -import -keystore cacerts -file test.cer

请帮我调试一下。

【问题讨论】:

  • 根据您的例外情况,这看起来不像 SSL exception,这意味着您的证书信任路径可能会得到正确验证。但是由于协议不匹配或您的主机名与证书不匹配等其他原因,连接可能会失败。您可以检查服务器支持的协议吗? Tou 正在使用 java 8 ,因此您的客户端应该使用 tlsv2
  • 您应该使用 -Djavax.net.debug=all 运行并查看失败的协议步骤
  • 我刚刚找到另一个thread,这可能对你有帮助。

标签: java ssl ssl-certificate


【解决方案1】:

您需要为您的 JVM 安装 JCE 扩展。基本上这个问题是由于本地 JAVA 和 https 站点之间的密码不匹配造成的。

使用https://www.ssllabs.com/检查你的REST API是否支持java,check this image example

如果显示这样,您可以从http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 下载文件。完成后,将 JRE 的 lib/security 目录下的两个 JAR(local_policy.jar、US_export_policy.jar)替换为下载包中的 JAR。

如果不是,请提供更多详细信息,以便我们详细检查。

在这里查看解决方案,我只是累了How to debug the ssl connection error,它对我有用并节省了我的一天!

【讨论】:

  • 这个问题的发帖人使用的是 OpenJDK,它从未包含 Oracle(和以前的 Sun)加密强度限制“功能”并且 不需要或使用Oracle 策略“升级”(注意这不会安装 JCE;JCE 已经是 JRE 的一部分,您只需安装 JCE 策略)。除了强度限制之外,还可能由于许多其他原因而发生密码不匹配,并且除了密码不匹配之外,还可能由于许多其他原因而发生handshake_failure; stackoverflow.com/questions/6353849/…(已经)链接在上面的评论中显示了其中的一些。
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2018-03-31
  • 2018-07-28
  • 2012-10-11
  • 2015-03-16
相关资源
最近更新 更多