Apache HTTP Client javax.net.ssl.SSLPeerUnverifiedException:peer未经过身份验证

时间:2013-04-05 14:50:45

标签: apache tomcat ssl httpclient ssl-certificate

我们正在使用tomcat和jersey开发一个应用程序 在此网络应用程序中,我们需要使用https Website与未过期的valid连接到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或者使用自定义CA,但是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

我将不胜感激任何帮助! 提前谢谢!

2 个答案:

答案 0 :(得分:5)

好的,我搞定了! 尽管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无法正确验证thawte证书。

列出密钥库向我展示,标准密钥库中有7个可信任的证书,但奇怪的是,在我手动导入pem文件之前它不起作用

答案 1 :(得分:0)

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

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

这是对的吗?

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