2016-01-21 142 views
1

我有一個Java客戶端,它使用Apache HttpClient 4.1庫向不需要身份驗證的服務器發出HTTP請求。如果我用瀏覽器或捲曲調用該服務器,則會接受請求。但是從我的Java客戶端,我看到下面的(當調試打開時)...Java客戶端無法與服務器建立SSL握手

main, WRITE: TLSv1 Handshake, length = 81 
main, WRITE: SSLv2 client hello message, length = 110 
main, handling exception: java.net.SocketException: Connection reset 

因此,似乎我的客戶的確在使用TLSv1握手但隨後派出的SSLv2客戶問候似乎該服務器沒有喜歡。根據this post似乎服務器不應拒絕SSLv2 ClientHello。它可能是一些特定的關於這個服務器,使它拒絕這ClientHello?

我還注意到,在建立連接的開始,下面的日誌輸出....

keyStore is : 
keyStore type is : jks 
keyStore provider is : 
init keystore 
init keymanager of type SunX509 
trustStore is: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts 
trustStore type is : jks 
trustStore provider is : 
init truststore 
adding as trusted cert: 
Subject: CN=Secure Global CA, O=SecureTrust Corporation, C=US 

然後它繼續補充各種實體作爲「可信證書」 S。

,最終例外,我注意到的是...

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

所以可以將它與證書(或缺乏)在我(客戶端)端的問題?但根據this post我認爲客戶不需要提供證書。

底線是我不清楚,如果問題的根源是SSLv2客戶端你好或證書或兩者兼而有之?

+0

這和安全性有什麼關係?我建議將其移至編程。 – 2016-01-21 16:05:15

+0

我在辯論放哪裏,但我選擇這裏,因爲問題的關鍵是爲什麼服務器會拒絕SSLv2客戶端你好(這裏的帖子表明它不應該),並且客戶端需要自己的證書(這裏的帖子也表示它不)。 – AbuMariam

+0

通常,客戶端不需要證書。我會首先排除SSL/TLS協議不匹配。訪問https://www.ssllabs.com/ssltest/並輸入服務器的主機名,這個工具會告訴你服務器支持哪些SSL/TLS協議。然後,從Java客戶端向https://www.ssllabs.com/ssltest/viewMyClient.html發出GET請求,並且這會告訴您客戶端支持哪些SSL/TLS協議。 – mti2935

回答

0

我有類似你的問題。這是我解決它的方式。它可能不會迎合您的具體問題,但請試一試。

SSLContextBuilder builder = new SSLContextBuilder(); 
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); 
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); 
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); 
相關問題