2012-08-05 26 views
0

基本put對象調用突然停止工作(有時會成功)。它一直在努力。JetS3t客戶端putObject停止使用HTTPS主機名異常

看起來像一個SSL證書問題。

Stack Trace snippet。

org.jets3t.service.S3ServiceException: S3 PUT connection failed for '/s3_request_message-38afbd8e-7d65-428a-a708-5d34104ded95-4912660956668093023.xml' 
      at org.jets3t.service.impl.rest.httpclient.RestS3Service.performRequest(RestS3Service.java:516) 
      at org.jets3t.service.impl.rest.httpclient.RestS3Service.performRestPut(RestS3Service.java:800) 
      at org.jets3t.service.impl.rest.httpclient.RestS3Service.createObjectImpl(RestS3Service.java:1399) 
      at org.jets3t.service.impl.rest.httpclient.RestS3Service.putObjectImpl(RestS3Service.java:1317) 
      at org.jets3t.service.S3Service.putObject(S3Service.java:1661) 
      at org.jets3t.service.S3Service.putObject(S3Service.java:1914) 
      at com.amazon.lm.utils.aws.S3Box.putFile(S3Box.java:111) 
      at com.amazon.lm.engine.LMEngine.copyRequestS3(LMEngine.java:350) 
      at com.amazon.lm.engine.LMEngine.run(LMEngine.java:165) 
      at com.amazon.lm.engine.discover.DiscoveryEngine.run(DiscoveryEngine.java:156) 
      at com.amazon.lm.engine.discover.GoogleBaseSearch.run(GoogleBaseSearch.java:25) 
      at com.amazon.lm.ui.UIDiscoverTask.run(UIDiscoverTask.java:41) 
      at java.lang.Thread.run(Thread.java:662) 
    Caused by: javax.net.ssl.SSLPeerUnverifiedException: HTTPS hostname invalid: expected 'lm-requests-prod.s3.amazonaws.com', received '*.s3.amazonaws.com' 
      at org.apache.commons.httpclient.contrib.ssl.StrictSSLProtocolSocketFactory.verifyHostname(StrictSSLProtocolSocketFactory.java:293) 
      at org.apache.commons.httpclient.contrib.ssl.StrictSSLProtocolSocketFactory.createSocket(StrictSSLProtocolSocketFactory.java:215) 
      at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) 
      at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) 
      at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) 
      at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
      at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
      at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) 
      at org.jets3t.service.impl.rest.httpclient.RestS3Service.performRequest(RestS3Service.java:342) 
      ... 12 more 

看起來像Java不喜歡錶現爲 '* .s3.amazonaws.com'

Can Java connect to wildcard ssl ...通配符可以用java問題通配符域。

但正如前面所說,我們一直在使用它,並且突然開始面對這個問題,這個問題也是間歇性的。

我們使用以下版本:

jdk: 1.6 
jets3: 0.7 
openssl:1.0 

有沒有人遇到這個問題?如果是,是否有任何解決方法?

回答

1

這個wasn't an issue with the AWSS3JavaClient code,基於這個問題發生在S3庫和其他Java S3庫的事實,以及事實上SSL cert verification is done inside the JVM platform library code,而不是在我們的S3庫代碼中。

問題是,我們的JVM的密鑰庫沒有最新的證書頒發機構(CA),允許JVM爲我們從S3 SSL端點獲得的任何證書形成一個信任鏈。這是Java和SSL的一個相當常見的問題,因爲JVM維護它自己的密鑰庫(即它不使用來自操作系統的證書)。

如果您遇到此問題,請嘗試使用其他JVM重現此問題。每當客戶過去看到這個問題時,都是因爲他們本地的JVM keystore(密鑰庫隨JVM一起提供幷包含最新的證書和CA)已過期。升級到最新的JVM版本在過去一直是這樣解決的。

嘗試將JVM version升級到最新版本,它應該有所幫助,因爲您的密鑰庫一定已過期! :)