该SSLSocket.getEnabledProtocols()
方法返回以下内容: [SSLv2Hello, SSLv3, TLSv1]
. 事实上,当我打电话connect()
并打开 SSL 调试时,我看到使用了 v2 客户端 hello:
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
但是我发现了两个(诚然是旧的)参考资料说 JSSE 不支持SSL 版本 2:
来自Java 基础网络:
'SSLv2Hello' 是一个伪协议,它允许 Java 使用 SSLv2 'hello message' 发起握手。这不会导致使用 Java 根本不支持的 SSLv2 协议。
并来自JSSE 参考指南:
J2SDK 1.4 和更高版本中的 JSSE 实现实现了 SSL 3.0 和 TLS 1.0。它没有实现 SSL 2.0。
现在,我的理解是,仅当客户端确实支持 SSL 2.0 版时,才应发送 2.0 版客户端问候语。来自RFC 2246:
支持 SSL 版本 2.0 服务器的 TLS 1.0 客户端必须发送 SSL 版本 2.0 客户端问候消息 [SSL2] ...警告:发送版本 2.0 客户端问候消息的能力将被淘汰,并尽快取消。
那么Java为什么要使用它呢?