一尘不染

Apache HTTP客户端javax.net.ssl.SSLPeerUnverifiedException:对等方未通过身份验证

tomcat

我们正在使用tomcat和jersey开发应用程序。
在这个web应用,我们需要连接到https Website同一个valid,没有过期certificate。如果我确实通过Chrome浏览器在本地连接到此网站,则一切正常!不幸的是,带有我们的Web应用程序的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

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


阅读 353

收藏
2020-06-16

共1个答案

一尘不染

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

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个thawte受信任证书,但是奇怪的是,直到我手动导入了pem文件,它才起作用

2020-06-16