如何解决受信任证书上的 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 怎么解决下?