【问题标题】:Apache HTTP Client javax.net.ssl.SSLPeerUnverifiedException: peer not authenticatedApache HTTP 客户端 javax.net.ssl.SSLPeerUnverifiedException:对等体未通过身份验证
【发布时间】:2013-03-28 01:13:04
【问题描述】:

我们正在使用 tomcat 和 jersey 开发应用程序。
在这个 web 应用程序中,我们需要使用valid 连接到https Website,而不是过期的certificate。 如果我通过我的 chrome 浏览器在本地连接到这个网站,一切正常! 不幸的是,我们的 webapp 的 tomcat 服务器抛出了一个异常。我们正在使用Apache HttpClient (4.0) 连接到 https 站点:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:371)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:126)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)

服务器证书绝对有效,来自thawte。 三个不同的在线工具成功验证了证书。
Openssl 也有一个问题,向我显示三个证书但抛出一个简单的错误:

Verify return code: 20 (unable to get local issuer certificate)

openssl 的问题似乎是它使用了错误的路径/usr/lib/ssl 而不是/etc/ssl/certs。如果我使用指向正确路径的 CApath 参数,openssl 可以正常工作,那么这可能是 httpClient 的问题吗?

所以我们的默认客户端代码非常简单:

    client = new DefaultHttpClient();
    response = client.execute(url); //this throws the exception
    EntityUtils.consume(response.getEntity());

通过实现自定义 TrustedManager 来允许任何证书不是一个选项! 我进一步读到,某些 CA 不是 JDK/JRE 的一部分,因此应将其证书手动导入 keystore 或使用自定义证书,但 thawte 是一个众所周知的 CA,它不应该在默认情况下工作吗?

编辑

我确实在 catalina.sh 中设置了 javax.debug 属性,以便获得有关该问题的更多信息:

http-bio-8080-exec-1, handling exception: 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

如果有任何帮助,我将不胜感激! 提前致谢!

【问题讨论】:

  • HttpClient 使用的 java 版本是什么?
  • @beny23 就像我说我使用的是 4.x
  • 哪个版本的java?
  • @beny23 抱歉,错过了你的 java 问题,我几乎可以肯定 6.x 但可以在星期一确定

标签: apache tomcat ssl httpclient ssl-certificate


【解决方案1】:

好的,我成功了! 尽管 thawte 是一个众所周知的 CA,但 Java SSL 似乎确实存在一些问题。 通过openssl下载ssl证书后:

echo |\
openssl s_client -connect ${REMHOST}:${REMPORT} 2>&1 |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

并将其保存到 pem 文件中,我手动导入到 java 密钥库中:

keytool -import -alias myAlias -file theCert.pem -keystore lib/security/cacerts

我不知道为什么 java ssl 无法正确验证解冻证书。

列出密钥库向我展示了标准密钥库中有 7 个 thawte 受信任的证书,但奇怪的是直到我手动导入 pem 文件后它才起作用

【讨论】:

    【解决方案2】:

    我正在尝试了解您的设置。你有一个 SSL 证书(由 Thwate 颁发),安装在 tomcat 中,你可以使用 IE、Firefox 或 Chrome 通过 SSL 访问你的网站。

    但是当您尝试使用 HttpClient 访问它时,您会收到上述错误?

    正确吗?

    该错误清楚地表明您的客户端不信任 CA。但是如果证书是由 Thwate 签名的(并且安装正确并且可以通过 IE/Firefox 等访问),那么它应该可以正常工作。

    【讨论】:

    • 几乎正确。我们为另一家公司开发了一个 webapp。这个 webapp 需要连接到公司提供的 https 网站。此外,该网站正在使用 thawte 的证书 - 有效且未过期,但我们的 apache HttpClient 正在引发上述异常。在本地,在我的浏览器(chrome)上,我可以正常访问该网站,但在服务器上却出现此错误。是否需要在tomcat服务器上安装证书?如果是,我该怎么做?我尝试从我的钥匙串(mac)中导出它并通过 keytool 安装它,但不费吹灰之力......
    • 嗯,它通过 chrome 工作,但不能通过 HttpClient。我以前没有使用过HttpClient。它是否在 java 容器中运行?如果是这样,您将需要验证 Java 容器是否信任 Thwate。使用 keytool 命令列出 java 安装的“cacerts”文件中的证书。
    • 我已经编辑了我的分析器,openssl 指向错误的目录存在问题。这也可能是一个问题吗?
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多