2014-01-23 165 views
3

我試圖執行與具體協議版本SSL連接,與下面的Java代碼:SSL連接

System.out.println("Locating socket factory for SSL..."); 
    SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault(); 
    System.out.println("Creating secure socket to " + https_url + ":443"); 
    SSLSocket sslSocket = (SSLSocket)sslsocketfactory.createSocket(); 
    String []protocol = {"SSLv2Hello"}; 
    sslSocket.setEnabledProtocols(protocol); 
    SocketAddress addr = new InetSocketAddress(https_url,443); 
    sslSocket.connect(addr); 
    String [] P = sslSocket.getEnabledProtocols(); 
    System.out.println("Enabled Protocol: " + Arrays.toString(P)); 

運行代碼時,我得到以下異常:

Exception in thread "main" java.lang.IllegalArgumentException: SSLv2Hello cannot be enabled unless at least one other supported version is also enabled. at sun.security.ssl.ProtocolList.(Unknown Source) at sun.security.ssl.ProtocolList.(Unknown Source) at sun.security.ssl.SSLSocketImpl.setEnabledProtocols(Unknown Source) at CheckByURL.test(CheckByURL.java:36) at CheckByURL.main(CheckByURL.java:15)

當我嘗試使用其他SSL版本時,它運行良好。

有人知道如何解決這個問題嗎?

回答

1

一個答案,那將是最好的參考http://tools.ietf.org/html/rfc6176

在短期,SSL V2中止在服務器端,但是最初的SSL V2客戶端請求可以被接受,但談判不應該定居V2。

+0

我試圖連接的服務器使用SSL v2。 當我使用SSL實驗室執行SSL測試時,似乎服務器支持SSL v2。 – user3202597

4

Oracle Java不支持SSLv2。它只支持SSLv2Hello消息和更高級別的協議,用於某些需要它的古代網站。因此,你得到的錯誤消息。 SSLv2Hello是一種僞協議,它只是告訴Java先使用SSLv2Hello消息而不是SSLv3或TLS Hello消息。

我相信IBM的JRE支持SSLv2。

但是,幾乎可以肯定的是,您嘗試連接的服務器也支持SSLv3,TLS等(如果不是它應該升級或脫機爲不安全)。因此,只需保留啓用的密碼套件,您就可以連接Oracle JRE。