Почему SSLSocket Java отправляет приветствие клиента версии 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 использует его?

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

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

Из справочника JSSE :

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

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

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

  • Можно ли заставить Java игнорировать «хранилище доверия» и просто принять любой сертификат SSL, который он получает?
  • Отключить SSLv3 в основных браузерах
  • Где получить сертификаты для Acrobat PDF
  • Как я могу использовать разные сертификаты для определенных соединений?
  • SSL, Tomcat и Grails
  • Можно ли заменить обычный разъем на SSLSocket?
  • Получение ошибки сертификата в IE и Chrome, но открывается в FireFox
  • Настройка Apache для обслуживания нескольких поддоменов через HTTP + HTTPS
  • Как я могу использовать WCF только с базовыми атрибутами, SSL и базовой аутентификацией в IIS?
  • Предупреждения Firefox «Неверное подключение» при посещении уважаемых сайтов HTTPS при использовании учетной записи ребенка
  • Ошибка SSL: certificate_verify_failed при очистке https://www.thenewboston.com/
  • Давайте будем гением компьютера.