Почему SSLSocket Java посылает привет клиенту версии 2? - PullRequest
23 голосов
/ 13 января 2011

Метод SSLSocket.getEnabledProtocols() возвращает следующее: [SSLv2Hello, SSLv3, TLSv1].И действительно, когда я звоню connect() и у меня включена отладка SSL, я вижу, что используется клиент v2 hello:

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

Но я нашел две (по общему признанию старые) ссылки, которые говорят, что JSSE делает не поддержка SSL версии 2:

С Основные сети в Java :

SSLv2Hello - это псевдопротокол, который позволяет Javaинициировать рукопожатие с помощью приветственного сообщения SSLv2.Это не вызывает использование протокола SSLv2, который вообще не поддерживается Java.

И из Справочного руководства JSSE :

Реализация JSSE в J2SDK 1.4 и более поздних версиях реализует SSL 3.0 и TLS 1.0.Он не реализует SSL 2.0.

Теперь я понимаю, что клиент 2.0 версии hello следует отправлять только тогда, когда клиент поддерживает SSL версии 2.0.От RFC 2246 :

Клиенты TLS 1.0, поддерживающие серверы SSL версии 2.0, должны отправлять приветственные сообщения клиента SSL версии 2.0 [SSL2] ... Предупреждение: Возможность отправлять приветственные сообщения клиента версии 2.0 будет полностью прекращена.

Так почему же Java использует его?

1 Ответ

18 голосов
/ 14 января 2011

JSSE от Sun не поддерживает SSLv2, но поддерживает SSlv2ClientHello, чтобы поддерживать некоторые SSL-серверы, которым это требуется.Вы можете отключить его, удалив его из включенных протоколов.

JSSE IBM полностью поддерживает SSLv2.

Из Справочного руководства JSSE :

Например, некоторые старые реализации серверов говорят только по SSLv3 и не понимают TLS.В идеале эти реализации должны согласовываться с SSLv3, но некоторые просто зависают.Для обратной совместимости некоторые реализации сервера (такие как SunJSSE) отправляют SSLv3 / TLS ClientHellos, инкапсулированные в пакет SSLv2 ClientHello.Некоторые серверы не принимают этот формат, в этих случаях используйте setEnabledProtocols, чтобы отключить отправку инкапсулированного SSLv2 ClientHellos.

Я полагаю, что «реализации сервера» должны читать «реализации SSL» выше.* РЕДАКТИРОВАТЬ: спасибо за цитирование моей книги!

...