【发布时间】:2010-10-24 04:36:10
【问题描述】:
我正在尝试使用 Java 代码从安全(即 SSL)网页中读取内容。 我正在尝试同时使用 URLConnection (java.net) 和 Apache 的 HTTPClient。 在这两种情况下,当我提出请求时,我都会收到以下异常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX 路径验证失败: java.security.cert.CertPathValidatorException: 基本约束检查失败: 违反了 pathLenConstraint - 此证书 必须是最后一个证书 认证路径在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518) 在 com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) 在 com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) 在 com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) 在 com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:934) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) 在 com.sap.river.coghead.rest.Main.testJavaHTTPConnection(Main.java:45) 在 com.sap.river.coghead.rest.Main.main(Main.java:32) 造成的: sun.security.validator.ValidatorException: PKIX 路径验证失败: java.security.cert.CertPathValidatorException: 基本约束检查失败: 违反了 pathLenConstraint - 此证书 必须是最后一个证书 认证路径在 sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:187) 在 sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:139) 在 sun.security.validator.Validator.validate(Validator.java:203) 在 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) 在 com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 13 更多原因: java.security.cert.CertPathValidatorException: 基本约束检查失败: 违反了 pathLenConstraint - 此证书 必须是最后一个证书 认证路径在 sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139) 在 sun.security.provider.certpath.PKIXCertPathValidator.doValidate(PKIXCertPathValidator.java:316) 在 sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:178) 在 java.security.cert.CertPathValidator.validate(CertPathValidator.java:206) 在 sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:182) ... 18 更多
请注意,我已经成功地建立了一个非 ssl 连接,但连接到不同的主机。 我还可以使用浏览器查看此页面 - 证书已在此处正确验证。
在从服务器检索证书时,您是否需要以某种方式更改证书的顺序? 有没有我遗漏的配置?
提前致谢,
里尔
【问题讨论】: