2011-01-13 23 views
21

Metodazwraca następujące wartości: [SSLv2Hello, SSLv3, TLSv1]. I rzeczywiście, gdy zgłoszę connect() i mam debugowanie SSL włączone, widzę, że cześć klient v2 jest używany:Dlaczego SSLSocket Javy wysyła wiadomość hello w wersji 2?

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

ale znalazłem dwa (co prawda stare) odniesienia, które mówią JSSE robi nie wsparcia SSL wersja 2:

Od Fundamental Networking in Java:

'SSLv2Hello' jest pseudo-protokół, który pozwala Java, aby zainicjować uścisk dłoni z SSLv2 'hello wiadomości'. To powoduje, że nie korzysta z protokołu SSLv2, który w ogóle nie jest obsługiwany przez Javę.

I od JSSE Reference Guide:

Realizacja JSSE w J2SDK 1,4 a później wdraża SSL 3.0 i TLS 1.0. Nie implementuje SSL 2.0.

Teraz moje rozumienie jest to, że wersja 2.0 klienta cześć powinna być wysłana tylko wtedy, gdy klient robi obsługę SSL w wersji 2.0. Od RFC 2246:

TLS 1.0, które obsługują klientów serwerów SSL wersja 2.0 musi wysyłać wiadomości SSL wersja 2.0 klienta cześć [SSL2] ... Warning: możliwość wysyłania wiadomości w wersji 2.0 klienta cześć zostaną wycofane z całym pośpiechem.

Dlaczego więc Java go używa?

+0

Protokół SSLv2Hello jest domyślnie włączony w JSSE Sun/Oracle Java 6, ale nie w wersji Java 7 lub nowszej. Przerywa na przykład otwieranie połączeń z www.howismyssl.com dla Java 6. – eckes

Odpowiedz

17

Sun JSSE nie obsługuje SSLv2, ale obsługuje SSlv2ClientHello, aby obsługiwać niektóre serwery SSL, które tego wymagają. Możesz go wyłączyć, usuwając go z włączonych protokołów.

IBM's JSSE obsługuje całkowicie SSLv2.

Z JSSE Reference Guide:

Na przykład, niektóre starsze implementacje serwera mówić tylko SSLv3 i nie rozumieją TLS. Idealnie, te implementacje powinny negocjować z SSLv3, ale niektóre po prostu się rozłączają. Dla kompatybilności wstecznej, niektóre implementacje serwera (takie jak SunJSSE) wysyłają klienta SSLv3/TLS zamkniętego w pakietu Clientvello SSLv2. Niektóre serwery nie akceptują tego formatu, w tych przypadkach w używają setEnabledProtocols do wyłączania wysyłania enkapsulowanych klientów Clientvellos SSLv2.

Wyobrażam sobie, że "implementacje serwera" powinny przeczytać "Implementacje SSL" powyżej.

EDYCJA: dzięki za cytowanie mojej książki!

+0

Dziękuję za odpowiedź. Czy mówisz, że te serwery, biorąc pod uwagę hello klienta V2, odpowiedzą za pomocą v3? –

+0

Ponadto, z ciekawości, masz pojęcie, do których serwerów odnosi się przewodnik? ;-) –

+0

@Matt Solnit: (a) tak (b) nie. – EJP