【问题标题】:Certificate cannot be resolved by PKIXValidatorPKIXValidator 无法解析证书
【发布时间】:2021-09-25 00:00:31
【问题描述】:

我遇到的问题是 TLS 证书(通配符证书)未解析为 Java 中的有效根证书。浏览器(Firefox、Chrome)将其解析为有效但不是 Java 驱动的程序。在我们的案例中,我们使用通配符证书。

certpath: Constraints: ...
...

...

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:349)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:292)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:287)
    at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654)
    at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473)
    at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369)
    at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421)
    at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:182)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1426)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1336)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:450)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:421)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at org.llorllale.youtrack.api.DefaultProjects.get(DefaultProjects.java:80)
    at com.company.youtrack.Main.main(Main.java:121)
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 java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
    at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
    at java.base/sun.security.validator.Validator.validate(Validator.java:264)
    at java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:313)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:222)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129)
    at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)
    ... 25 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297)
    at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434)
    ... 31 more

编辑 我在公司网络内运行 YouTrack 服务器,无法从 Internet 访问。我配置了包括根证书在内的直接证书链。但遗憾的是根证书本身没有返回(用 openssl s_client 测试过)。

我还想提一下,服务器证书是通配符证书。我真的不知道这是否会导致验证过程中出现问题...

编辑

我知道返回自签名根不是最佳做法。尽管我在整个研究过程中发现 cmets 有人说有时是必要的。我真的不知道为什么有必要确定...我分析了 PKIXValidator 中的代码,在我看来,验证器正在解析链,直到它收到颁发者等于主题的证书。我的问题是(正如我用 openssl s_client 分析的那样)服务器只返回服务器证书和第一个中间证书。但是还有第二个中间证书和一个根。我在 youtrack 提交了一个错误。见https://youtrack.jetbrains.com/issue/JT-66316。由于内部原因,有些 cmets 我没有公开。解决问题后,我将在此处报告解决方案。与此同时,我想把问题留在这里。

【问题讨论】:

  • 很遗憾,由于 stackoverflow 的限制,我无法发布更多详细信息。要么是 SMAP,要么太长,要么太短。 wtf...
  • 我想向我的问题提交详细信息,但遗憾的是 StackOverflow 说我的帖子包含太多代码......但是我想发布“certpath”调试信息但 StackOverflow 没有让我...... . 要么我被识别为垃圾邮件,要么信息太短或代码(文本日志信息)太长。我快疯了!
  • 您能告诉我们根证书的名称吗?
  • 您告诉 java 使用什么 cacert 文件来验证证书?该文件应该在您的浏览器中列出公共证书才能正常工作。
  • 根证书是USERtrust RSA证书颁发机构,序列号01:FD:6D:30:FC:A3:CA:51:A8:1B:BC:C4:0E:35:03:2D

标签: java ssl connection certificate


【解决方案1】:

浏览器使用证书 AIA 信息,而 Java/Linux 不使用(默认情况下)。您的服务器可能配置为提供证书,但不提供证书,直至您的 Java 应用程序识别的信任锚。 openssl (s_client) 或https://certcheckerapp.com/ 可以帮助您查看服务器实际返回的内容。

【讨论】:

  • 感谢 Toby 对问题的回答。我用 openssl s_client 检查了发送的证书链,发现除了根证书之外的所有证书都返回了。这会是个问题吗?奇怪的是我在服务器上配置了一个链,包括根证书,但正如我所说,这个根没有返回。我在公司网络内运行 YouTrack 服务器,无法从 Internet 访问。我还想提一下,我已经安装了通配符服务器证书。这也会导致问题吗?
  • 服务器通常不应返回(自签名)信任锚,因为它们无助于证明信任。如果签署链中最后一个证书的根证书在您应用的信任库中,则您的应用应该信任它。假设它是 SAN(不要认为在 DN 中可能)并且您的 dns 被通配符覆盖,通配符应该不是问题。您确定该服务器/链的信任锚在您的 JRE 信任库中吗?
  • 我知道返回自签名根不是最佳做法。尽管我在整个研究过程中发现 cmets 有人说有时是必要的。我真的不知道为什么有必要确定...我分析了 PKIXValidator 中的代码,在我看来,验证器正在解析链,直到它收到颁发者等于主题的证书。我的问题是(正如我用 openssl s_client 分析的那样)服务器只返回服务器证书和第一个中间证书。但是还有第二个中间证书和一个根。我在 youtrack 提交了一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2021-04-14
  • 2014-02-21
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多