2011-01-13 99 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

相关问题