【发布时间】:2011-06-08 15:38:09
【问题描述】:
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:
来自Fundamental Networking in Java:
'SSLv2Hello' 是一个伪协议,它允许 Java 使用 SSLv2 'hello message' 发起握手。这不会导致使用 Java 根本不支持的 SSLv2 协议。
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 使用它呢?
【问题讨论】:
-
在 Sun/Oracle Java 6 的 JSSE 上默认开启 SSLv2Hello,但在 Java 7 或更高版本上不开启。例如,它会中断与 www.howismyssl.com 的 Java 6 连接。