The SSLSocket.getEnabledProtocols()
方法返回以下内容:[SSLv2Hello, SSLv3, TLSv1]
。事实上,当我打电话时connect()
并且我打开了 SSL 调试,我看到使用了 v2 客户端 hello:
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
但我发现两个(诚然是旧的)参考资料说 JSSE 确实not支持 SSL 版本 2:
From :
“SSLv2Hello”是一个伪协议,它允许 Java 使用 SSLv2“hello 消息”启动握手。这确实not导致使用 SSLv2 协议,而 Java 根本不支持该协议。
并从JSSE 参考指南 http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html:
J2SDK 1.4 及更高版本中的 JSSE 实现实现了 SSL 3.0 和 TLS 1.0。它不实现 SSL 2.0。
现在,我的理解是,版本 2.0 客户端问候仅应在客户端does支持SSL 2.0版本。从RFC 2246 http://www.ietf.org/rfc/rfc2246.txt:
支持 SSL 版本 2.0 服务器的 TLS 1.0 客户端必须发送 SSL
版本 2.0 客户端问候消息 [SSL2] ...Warning:发送 2.0 版客户端问候消息的功能将被尽快淘汰。
那么Java为什么要使用它呢?
Sun 的 JSSE 不支持 SSLv2,但支持SSlv2ClientHello
,以支持一些需要它的 SSL 服务器。您可以通过将其从启用的协议中删除来将其关闭。
IBM 的 JSSE 完全支持 SSLv2。
来自JSSE 参考指南 http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html:
例如,一些较旧的服务器
实现仅使用 SSLv3 和
不了解 TLS。理想情况下,这些
实施应协商
SSLv3,但有些只是挂断。为了
向后兼容性,某些服务器
实现(例如 SunJSSE)发送
SSLv3/TLS ClientHellos 封装在
SSLv2 ClientHello 数据包。一些
服务器不接受这种格式,在
这些情况使用 setEnabledProtocols 来
禁止发送封装的
SSLv2 客户端您好。
我想“服务器实现”应该读为上面的“SSL 实现”。
编辑:感谢您引用我的书!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)