2011-01-13 2 views
21

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?

+0

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

Antwort

17

Sun JSSE unterstützt SSLv2 nicht, aber es unterstützt die SSlv2ClientHello, um einige SSL-Server zu unterstützen, die es erfordern. Sie können es deaktivieren, indem Sie es aus den aktivierten Protokollen entfernen.

IBMs JSSE unterstützt SSLv2 vollständig.

Vom JSSE Reference Guide:

Zum Beispiel, einige ältere Server Implementierungen sprechen nur SSLv3 und TLS nicht verstehen. Im Idealfall sollten diese Implementierungen zu SSLv3 verhandeln, aber einige einfach auflegen. Für Abwärtskompatibilität, einige Server Implementierungen (wie SunJSSE) senden SSLv3/TLS ClientHellos in ein SSLv2 ClientHello-Paket eingekapselt. Einige Server akzeptieren dieses Format nicht, in diese Fälle verwenden setEnabledProtocols zu deaktivieren das Senden von gekapselten SSLv2 ClientHellos.

Ich stelle mir vor 'Server-Implementierungen' sollte oben 'SSL-Implementierungen' lesen.

EDIT: Vielen Dank für mein Buch zitieren!

+0

Danke für Ihre Antwort. Wollen Sie damit sagen, dass diese Server bei einem V2-Client hallo mit v3 antworten? –

+0

Haben Sie aus Neugierde auch eine Idee, auf welche Server sich der Guide bezieht? ;-) –

+0

@Matt Solnit: (a) ja (b) nein. – EJP

Verwandte Themen