【发布时间】: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