2011-01-13 101 views
21

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。

而且從JSSE Reference Guide

在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使用它?

+0

在Sun/Oracle Java 6的JSSE上缺省打開SSLv2Hello,但不在Java 7或更高版本上打開。它打破例如與www.howismyssl.com爲Java 6開放connectins。 – eckes 2014-11-02 20:30:06

回答

17

Sun的JSSE不支持SSLv2,但它支持SSlv2ClientHello,以支持一些需要它的SSL服務器。您可以通過從啓用的協議中刪除它來關閉它。

IBM的JSSE完全支持SSLv2。

JSSE Reference Guide

例如,一些舊的服務器 實現只講SSLv3和 不懂TLS。理想情況下,這些 實現應協商到 SSLv3,但有些只是掛斷。對於 向後兼容,一些服務器實現(如SunJSSE)發送 SSLv3/TLS ClientHellos封裝在 SSLv2 ClientHello數據包。有些 服務器不接受這種格式,在 這些情況下使用setEnabledProtocols來 禁用發送封裝的 SSLv2 ClientHellos。

我想'服務器實現'應該讀取上面的'SSL實現'。

編輯:謝謝你引用我的書!

+0

感謝您的答案。你是否說這些服務器,給V2客戶端打招呼,會使用v3進行響應? – 2011-01-14 19:51:37

相關問題