如何解决受信任证书上的 SSLHandshakeException?

Posted

技术标签:

【中文标题】如何解决受信任证书上的 SSLHandshakeException?【英文标题】:How to resolve SSLHandshakeException on a trusted certificate? 【发布时间】:2017-01-23 06:11:23 【问题描述】:

我们有一个 JavaFX 应用程序在 https 安全资源上调用我们的后端。应用程序连续对同一个 url 执行数百个请求,以从服务器获取数据。

这通常没有问题,但现在我们有一个客户在连接到资源时报告了SSLHandshakeException 问题。他可以很好地处理数百个请求,而对于下一个请求,客户端会失败:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Java couldn't trust Server 
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.access$200(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessController.doPrivileged(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at com.project.common.ws.client.HttpUrlConnectionRestClient.b(ProGuard:339)
    at com.project.common.ws.client.HttpUrlConnectionRestClient.a(ProGuard:227)
    at com.project.common.ws.client.HttpUrlConnectionRestClient.a(ProGuard:56)
    at com.project.common.ws.client.HttpUrlConnectionRestClient.a(ProGuard:387)
    at com.project.projects.map.client.manager.GeomanagerWorker.readGeocodingChunk(ProGuard:5640)
    at com.project.projects.map.client.manager.n.readGeocodingChunk(ProGuard:4337)
    at com.project.projects.map.client.manager.modules.fx.imports.b.nF(ProGuard:199)
    at com.project.projects.map.client.manager.modules.fx.imports.b.call(ProGuard:174)
    at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.security.cert.CertificateException: Java couldn't trust Server 
    at com.sun.deploy.security.X509TrustManagerDelegate.checkTrusted(Unknown Source)
    at com.sun.deploy.security.X509Extended7DeployTrustManagerDelegate.checkServerTrusted(Unknown Source)
    at com.sun.deploy.security.X509Extended7DeployTrustManager.checkServerTrusted(Unknown Source)
    ... 30 more

我们的 SSL 证书由 GeoTrust SSL CA - G3 签署,有效期至 2016 年 12 月 13 日。 客户客户端使用 Java 1.8.0_40

我研究过不同的文章。 This 有人说,这可能与证书域名区分大小写的错误有关。但是我们在证书和请求上都使用全小写,所以应该没问题。

This 文章显示,问题可能与 Java 版本有关,因为“可能新的 Java 版本更严格地执行 SSL CA”。 它还说,升级到最新的 java 版本可能会解决问题。我还没有选中这个选项,因为由于公司的 IT 限制,客户并不总是可以只升级 Java 版本。

更重要的是,我们需要 Java 版本 1.8 才能运行,所以如果它不适用于 1.8.0_40 版本,那就太糟糕了。

有谁知道这个问题是否有确切的原因?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。我必须降级到 Java 1.6 才能使 ASDM-IDM 连接器正常工作。

【讨论】:

以上是关于如何解决受信任证书上的 SSLHandshakeException?的主要内容,如果未能解决你的问题,请参考以下文章

服务器证书不受信任怎么解决

charles进行手机抓包:安全证书不受信任,错误码3 怎么解决下?

如何将SSL证书设置成受信任的证书

VSTO证书不受信任,Office Addin无法安装问题的解决

Azure 应用服务上的受信任根证书

如何以编程方式将证书添加为当前JVM实例的受信任