Подтвердить что ты не робот

Почему Java SSLSocket отправляет приветствие клиента версии 2?

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

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 должно отправляться только тогда, когда клиент выполняет поддержку SSL версии 2.0. Из RFC 2246:

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

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

4b9b3361

Ответ 1

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

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

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

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

Я полагаю, что "реализация сервера" должна читать выше "реализации SSL".

EDIT: спасибо за цитирование моей книги!