jjzjj

java - 无法在 Java : "pathLenConstraint violated - this cert must be the last cert in the certification path" 中对 SSL 站点进行身份验证

coder 2024-03-19 原文

我正在尝试使用 Java 代码从安全(即 SSL)网页中读取内容。 我正在尝试同时使用 URLConnection (java.net) 和 Apache 的 HTTPClient。 在这两种情况下,当我发出请求时,我都会收到此异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: basic constraints check failed: pathLenConstraint violated - this cert must be the last cert in the certification path at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:934) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) at com.sap.river.coghead.rest.Main.testJavaHTTPConnection(Main.java:45) at com.sap.river.coghead.rest.Main.main(Main.java:32) Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: basic constraints check failed: pathLenConstraint violated - this cert must be the last cert in the certification path at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:187) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:139) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 13 more Caused by: java.security.cert.CertPathValidatorException: basic constraints check failed: pathLenConstraint violated - this cert must be the last cert in the certification path at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139) at sun.security.provider.certpath.PKIXCertPathValidator.doValidate(PKIXCertPathValidator.java:316) at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:178) at java.security.cert.CertPathValidator.validate(CertPathValidator.java:206) at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:182) ... 18 more

请注意,我已经成功地建立了一个非 SSL 连接,不过是连接到另一个主机。 我还可以使用浏览器查看此页面 - 证书在那里得到了正确验证。

您是否需要以某种方式更改从服务器检索证书的顺序? 是否缺少某些配置?

提前致谢

李尔

最佳答案

我进一步挖掘,答案在于我需要将必要的证书导入到 JVM 用来验证 SSL 的 keystore 中。 keystore 是用于运行程序的 jre 中 jre/lib/security 文件夹下的 'cacerts' 文件。

我手动导出了站点的证书 - 所有这些证书。
然后我使用 Sun 提供的“keytool”实用程序将它导入到我的默认 keystore 中。请注意,您必须以正确的顺序导入它们。
然后我放置了新的 keystore 而不是 JRE 的 keystore ——它起作用了。

我想将证书直接导入 JRE 的 keystore 会更好,但该工具要求我提供一个我不知道的密码。

我相信还有一种方法可以更轻松地解决这个问题,只是还没有找到。我很乐意得到一些指示(JSSE 中的 TrustManager 类?)。

最后,一些功劳。这篇文章在这里:http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html帮助我指明了正确的方向。

关于java - 无法在 Java : "pathLenConstraint violated - this cert must be the last cert in the certification path" 中对 SSL 站点进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829522/

有关java - 无法在 Java : "pathLenConstraint violated - this cert must be the last cert in the certification path" 中对 SSL 站点进行身份验证的更多相关文章

随机推荐