2013-04-05 123 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

相關問題