¿Por qué el SSLSocket de Java envía un cliente de la versión 2 hola?

El método SSLSocket.getEnabledProtocols() devuelve lo siguiente: [SSLv2Hello, SSLv3, TLSv1] . Y, de hecho, cuando llamo a connect() y tengo activada la depuración de SSL, veo que se usa un cliente de v2:

 main, WRITE: TLSv1 Handshake, length = 81 main, WRITE: SSLv2 client hello message, length = 110 

Pero he encontrado dos referencias (ciertamente antiguas) que dicen que JSSE no es compatible con SSL versión 2:

De Fundamental Networking en Java :

‘SSLv2Hello’ es un pseudo-protocolo que permite a Java iniciar el protocolo de enlace con un ‘mensaje de saludo’ SSLv2. Esto no causa el uso del protocolo SSLv2, que no es compatible con Java en absoluto.

Y de la Guía de referencia de JSSE :

La implementación de JSSE en J2SDK 1.4 y posterior implementa SSL 3.0 y TLS 1.0. No implementa SSL 2.0.

Ahora, tengo entendido que la versión 2.0 del cliente hello solo debe enviarse cuando el cliente admite SSL versión 2.0. De RFC 2246 :

Los clientes de TLS 1.0 compatibles con los servidores de SSL Versión 2.0 deben enviar mensajes de saludo de cliente de SSL Versión 2.0 [SSL2] … Advertencia: la capacidad de enviar mensajes de saludo de cliente de Versión 2.0 se eliminará con la celeridad debida.

Entonces, ¿por qué Java lo usa?

Sun JSSE no es compatible con SSLv2 pero admite SSlv2ClientHello , para admitir algunos servidores SSL que lo requieren. Puede desactivarlo quitándolo de los protocolos habilitados.

JSSE de IBM es compatible con SSLv2 por completo.

De la guía de referencia JSSE :

Por ejemplo, algunas implementaciones de servidores anteriores solo hablan SSLv3 y no entienden TLS. Idealmente, estas implementaciones deberían negociar a SSLv3, pero algunas simplemente se cuelgan. Para compatibilidad con versiones anteriores, algunas implementaciones de servidor (como SunJSSE) envían SSLv3 / TLS ClientHellos encapsulado en un paquete SSLv2 ClientHello. Algunos servidores no aceptan este formato, en estos casos use setEnabledProtocols para deshabilitar el envío de SSLV2 ClientHellos encapsulado.

Imagino que las ‘implementaciones de servidor’ deberían leer ‘Implementaciones SSL’ arriba.

EDIT: gracias por citar mi libro!