Pourquoi Java est SSLSocket envoyer une version 2 client bonjour?

La SSLSocket.getEnabledProtocols() méthode renvoie les éléments suivants: [SSLv2Hello, SSLv3, TLSv1]. Et en effet, quand je l'appelle connect() et j'ai SSL débogage activé, je ne vois qu'une v2 client bonjour est utilisé:

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

Mais j'en ai trouvé deux (certes vieux) références que dire JSSE ne pas en charge SSL version 2:

De Fondamentaux de Réseau en Java:

'SSLv2Hello" est un pseudo-protocole qui permet de Java pour lancer la poignée de main avec un SSLv2 'bonjour le message". Ce n' pas cause de l'utilisation de la SSLv2 protocole, qui n'est pas pris en charge par Java à tous.

Et de la JSSE Guide de Référence:

La JSSE mise en œuvre dans le J2SDK 1.4 et, plus tard, met en œuvre le protocole SSL 3.0 et TLS 1.0. Il ne permet pas de mettre en œuvre le protocole SSL 2.0.

Maintenant, ma compréhension est que la version 2.0 client bonjour devraient être envoyés uniquement lorsque le client ne en charge SSL version 2.0. De RFC 2246:

TLS 1.0 clients qui prennent en charge SSL Version 2.0 serveurs doivent envoyer SSL
La Version 2.0 client de messages "hello" [SSL2] ... Avertissement: La possibilité d'envoyer la Version 2.0 client hello les messages seront supprimés progressivement avec hâte.

Alors pourquoi ne Java utiliser?

  • Le SSLv2Hello est activée par défaut sur les JSSE de Sun/Oracle Java 6, mais pas de Java 7 ou une version ultérieure. Il rompt par exemple l'ouverture d'connectins avec www.howismyssl.com pour la version 6 de Java.
InformationsquelleAutor Matt Solnit | 2011-01-13