SSLSocket.getEnabledProtocols()
方法返回以下內容:[SSLv2Hello, SSLv3, TLSv1]
。事實上,當我打電話connect()
,我有SSL調試打開,我看到一個V2客戶端問候時:爲什麼Java的SSLSocket發送版本2客戶端hello?
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
但我已經發現了兩個(誠然舊)基準說JSSE確實不支持SSL版本2:
從Fundamental Networking in Java:
'SSLv2Hello' 是一個僞協議,該協議允許Java發起握手用的SSLv2 'hello消息'。這不是而是導致使用SSLv2協議,根本不支持Java。
在J2SDK 1.4 JSSE實現後來實現了SSL 3.0和TLS 1.0。它沒有實現SSL 2.0。
現在,我的理解是,當客戶端確實支持SSL 2.0版本2.0版客戶端問候應該只被發送。從RFC 2246:
TLS 1.0,支持SSL版本的客戶端2.0服務器必須發送SSL 2.0版客戶端的Hello報文[SSL2] ... 警告:的能力送2.0版客戶端的Hello報文將被淘汰全力以赴。
那麼爲什麼Java使用它?
在Sun/Oracle Java 6的JSSE上缺省打開SSLv2Hello,但不在Java 7或更高版本上打開。它打破例如與www.howismyssl.com爲Java 6開放connectins。 – eckes 2014-11-02 20:30:06