Метод возвращает [SSLv2Hello, SSLv3, TLSv1]
. И действительно, когда я называю connect()
и я отладка SSL включена, я вижу, что используется v2 клиент привет:Почему SSLSocket Java отправляет приветствие клиента версии 2?
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
Но я нашел два (по общему признанию, старые) ссылки, которые говорят JSSE делают поддержку не SSL версии 2:
От Fundamental Networking in Java:
'SSLv2Hello' является псевдо-протокол, который позволяет Java, чтобы инициировать установление связи с SSLv2 'Привет сообщение'. Это делает не причиной использования протокола SSLv2, который вообще не поддерживается Java.
А из JSSE Reference Guide:
Реализация 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 использует его?
SSLv2Hello включен по умолчанию в JSSE Sun/Oracle Java 6, но не Java 7 или новее. Это ломается, например, открытие connectins с www.howismyssl.com для Java 6. – eckes