2011-01-13 3 views
21

Метод возвращает [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 использует его?

+0

SSLv2Hello включен по умолчанию в JSSE Sun/Oracle Java 6, но не Java 7 или новее. Это ломается, например, открытие connectins с www.howismyssl.com для Java 6. – eckes

ответ

17

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

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

Из JSSE Reference Guide:

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

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

EDIT: спасибо, что процитировал мою книгу!

+0

Спасибо за ваш ответ. Вы говорите, что эти серверы, получившие приветствие клиента V2, ответят с помощью v3? –

+0

Кроме того, из любопытства, есть ли у вас какие-либо идеи, на какие серверы ссылается руководство? ;-) –

+0

@Matt Solnit: (a) да (b) нет. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^