2013-04-05 76 views
2

我们正在开发一个使用tomcat和jersey的应用程序。
在这个web应用程序中,我们需要连接到一个https Websitevalid,未过期certificate。 如果我通过我的浏览器在本地连接到本网站,一切正常! 不幸的是,我们的webapp的tomcat服务器抛出一个异常。我们使用Apache HttpClient (4.0)连接到HTTPS站点:Apache HTTP客户端javax.net.ssl.SSLPeerUnverifiedException:未通过身份验证的对象

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 

我希望得到任何帮助! 在此先感谢!

+0

? – beny23 2013-04-05 22:13:30

+0

@ beny23像我说的我正在使用4.x – Alexander 2013-04-06 07:46:40

+0

哪个版本的java? – beny23 2013-04-06 11:28:41

回答

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是不是能够正确验证解冻证书。

清单密钥库给我看,有7 Thawte的受信任的证书在标准密钥库,但奇怪的是它没有工作,直到我手动导入你用`HttpClient`使用的Java版本PEM文件

0

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

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

这是正确的吗?

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

+0

几乎正确。我们为另一家公司开发了一个webapp。这个webapp需要连接到公司提供的https网站。此外,网站正在使用thawte的证书 - 有效且未过期,但我们的apache HttpClient正在抛出上述异常。在本地,在我的浏览器(铬)我可以正确访问该网站,但在服务器上,但有这个错误。是否有必要在tomcat服务器上安装证书?如果是的话,我该怎么做?我试图从我的钥匙串(mac)中导出它,并通过keytool安装它,但没有费力...... – Alexander 2013-04-06 07:55:20

+0

嗯,它通过chrome工作,但不通过HttpClient。我之前没有使用过HttpClient。它运行在一个Java容器中吗?如果是这样,您将需要验证Thwate是否被java容器信任。使用keytool命令列出java安装的“cacerts”文件中的证书。 – bubbly 2013-04-06 16:27:21

+0

我编辑了我的anser,openssl指向错误的目录时出现问题。这也可能是一个问题吗? – Alexander 2013-04-08 06:50:16

相关问题