2013-09-27 51 views
1

我有客戶端應用程序,它使用我需要連接到不同服務器的apache-commons-httpclient 2.0。 作爲加密協議使用:如何定義(使用Java)服務器使用哪種加密協議(SSL或TLS)?

protocols = new String[]{"SSLv3", "SSLv2Hello", "TLSv1"}; 
((SSLSocket) socket).setEnabledProtocols(protocols); 

一般情況下,它工作正常,但有一些服務器會發生以下情況:

main, handling exception: java.net.SocketException: Software caused connection abort: recv failed 
main, SEND SSLv3 ALERT: fatal, description = unexpected_message 
Padded plaintext before ENCRYPTION: len = 22 
0000: 02 0A 7B FA 57 7E 6E B7 56 4C 8A 2F 7F 1F BC 9F ....W.n.VL./.... 
0010: A6 80 57 12 0B EE         ..W... 
main, WRITE: SSLv3 Alert, length = 22 
main, Exception sending alert: java.net.SocketException: Software caused connection abort: socket write error 

如果我從協議列表中刪除的TLSv1,它會正常工作與此服務器,我會得到預期的200狀態。 因此,我有這個問題 - 如何事先定義服務器支持哪種協議(SSL或TLS)和協議版本?

或者也許有其他方法可以解決這個問題?

+0

我記得TLSv1.0有一個安全問題 - 我認爲它可能會因此被拒絕......我會嘗試用「TLSv1.2」代替。 – ppeterka

+1

@ ppeterka66,支持SSLv3但不支持TLSv1的服務器不太可能支持TLSv1.2。不幸的是,TLSv1.2支持還不是很普遍。 – Bruno

+0

嘗試使用相同的服務器,而不必更改已啓用的協議。 – EJP

回答

0

好吧,我已經找到了如何獲得啓用服務器協議:

Socket socket = sSLSocketFactory.createSocket(host, port); 
((SSLSocket) socket).getEnabledProtocols(); 

但它沒有幫助,「因爲它給了我:

SSLv2Hello 
SSLv3 
TLSv1 

這意味着服務器應該支持TLSv1。所以問題在別的地方。