Почему 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 использует его?
Ответы
Ответ 1
Sun JSSE не поддерживает SSLv2, но поддерживает SSlv2ClientHello
, чтобы поддерживать некоторые серверы SSL, которые этого требуют. Вы можете отключить его, удалив его из разрешенных протоколов.
IBM JSSE полностью поддерживает SSLv2.
Из Справочное руководство JSSE:
Например, какой-то старый сервер реализации говорят только SSLv3 и не понимают TLS. В идеале эти реализации должны SSLv3, но некоторые просто зависают. Для обратная совместимость, некоторый сервер реализации (например, SunJSSE) SSLv3/TLS ClientHellos, инкапсулированный в пакет SSLv2 ClientHello. Некоторые серверы не принимают этот формат, в эти случаи используют setEnabledProtocols для отключить отправку инкапсулированных SSLv2 ClientHellos.
Я полагаю, что "реализация сервера" должна читать выше "реализации SSL".
EDIT: спасибо за цитирование моей книги!