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