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客戶端你好或證書或兩者兼而有之?
這和安全性有什麼關係?我建議將其移至編程。 – 2016-01-21 16:05:15
我在辯論放哪裏,但我選擇這裏,因爲問題的關鍵是爲什麼服務器會拒絕SSLv2客戶端你好(這裏的帖子表明它不應該),並且客戶端需要自己的證書(這裏的帖子也表示它不)。 – AbuMariam
通常,客戶端不需要證書。我會首先排除SSL/TLS協議不匹配。訪問https://www.ssllabs.com/ssltest/並輸入服務器的主機名,這個工具會告訴你服務器支持哪些SSL/TLS協議。然後,從Java客戶端向https://www.ssllabs.com/ssltest/viewMyClient.html發出GET請求,並且這會告訴您客戶端支持哪些SSL/TLS協議。 – mti2935