Die Methode SSLSocket.getEnabledProtocols()
gibt Folgendes zurück: [SSLv2Hello, SSLv3, TLSv1]
. Und in der Tat, wenn ich connect()
nennen, und ich habe SSL-Debugging eingeschaltet, ich sehe, dass ein v2 Client hallo verwendet wird:Warum sendet Java SSLSocket einen Client der Version 2 Hallo?
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
Aber ich habe zwei (zugegebenermaßen alt) Referenzen gefunden, die sagen JSSE tut nicht Unterstützung SSL Version 2:
Von Fundamental Networking in Java:
'SSLv2Hello' ist ein pseudo-Protokoll, das Java den Handshake mit einem SSLv2 zu initiieren erlaubt 'hallo Nachricht'. Dies bewirkt nicht Ursache Verwendung des SSLv2-Protokolls, das überhaupt nicht von Java unterstützt wird.
Und von den JSSE Reference Guide:
Die JSSE-Implementierung im J2SDK 1.4 und implementiert später SSL 3.0 und TLS 1.0. Es implementiert kein SSL 2.0.
Nun ist mein Verständnis, dass die Version 2.0 Client hallo nur, wenn der Client Unterstützung SSL-Version 2.0 gesendet werden soll. Von RFC 2246:
TLS 1.0-Clients, die SSL-Version 2.0-Server unterstützen muss SSL Version 2.0 Client-Hallo-Nachrichten [SSL2] ... Warnung senden: Die Fähigkeit wird Version 2.0 Client-Hallo-Nachrichten senden auslaufen mit aller gebotenen Eile.
Warum verwendet Java es?
Der SSLv2Hello ist standardmäßig auf JSSE von Sun/Oracle Java 6, aber nicht Java 7 oder höher aktiviert. Es bricht zum Beispiel öffnende connectins mit www.howismyssl.com für Java 6. – eckes