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?
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