【问题标题】:Java URL Connection javax.net.ssl.SSLHandShakeException [duplicate]Java URL 连接 javax.net.ssl.SSLHandShakeException [重复]
【发布时间】:2015-11-23 12:58:49
【问题描述】:

已解决 - 我通过将我的 cacerts 文件从我的 windows 机器复制到 pi 来解决它。

我正在编写一个应用程序以使用长轮询从网络服务器获取 json 字符串,该应用程序在我正在开发的 Windows 机器上运行良好。然后我将源代码移动到树莓派并编译它,现在它抛出了这个异常:

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
            at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
            at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1917)
            at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:301)
            at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:295)
            at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1369)
            at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:156)
            at sun.security.ssl.Handshaker.processLoop(Handshaker.java:925)
            at sun.security.ssl.Handshaker.process_record(Handshaker.java:860)
            at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043)
            at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
            at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
            at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1511)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
            at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
            at VideoBoard.main(VideoBoard.java:29)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
            at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
            at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
            at sun.security.validator.Validator.validate(Validator.java:260)
            at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
            at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
            at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
            at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1351)
            ... 13 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
            at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
            at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
            at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
            at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
            ... 19 more

我的网站由 GoDaddy 托管,他们还提供 SSL 证书。通过浏览器或 java 从我的桌面访问该站点时没有任何问题,所有迹象都表明 SSL 证书有效且受我的机器信任。

【问题讨论】:

  • URLConnection 连接 = 新 URL(url + "?" + query).openConnection(); connection.setRequestProperty("Accept-Charset", charset); InputStream 响应 = connection.getInputStream();

标签: java ssl urlconnection


【解决方案1】:

您在 Raspberry Pi 上使用的操作系统在您在服务器上使用的操作系统的证书路径中没有受信任的证书。换句话说,树莓派不知道要相信你的服务器就是它所说的那样。

要解决此问题,您需要在您的 Pi 上安装 GoDaddy 的根证书。如果您使用的是 Raspbian 或其他 Debian 衍生操作系统,here 是一个很好的关于如何执行此操作的文章,here 是 GoDaddy 的证书存储库。

【讨论】:

  • 我已经安装了 3 个似乎最有意义的证书,但仍然没有运气。
  • 您可以尝试打开浏览器,导航到您的站点,然后单击地址栏中的锁定图标,然后查看您的证书是由哪个证书颁发机构验证的吗?对不起,第一个链接有点不清楚;您是否将证书放在/usr/local/share/ca-certificates/ 的新目录中,然后运行sudo update-ca-certificates
  • /usr/local/share/ca-certificates/godaddy.org$ ls gd-class2-root.crt gdig2.crt gdroot-g2.crt
  • 我也会尝试抓取 gd_intermediate.crt。
  • 我通过将我的 cacerts 文件从我的 windows 机器复制到 pi 来解决它。
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 2012-10-20
  • 2013-05-05
  • 2018-11-09
  • 2019-06-28
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多