Как инициировать ssl-соединение с использованием SSLv2
Я хочу установить соединение SSL с удаленным сервером, используя SSLv2. Я использую Java. Я попытался получить поддерживаемые протоколы в моем сокете, используя:
String[] suppProtocols=socket.getSupportedProtocols();
System.out.println("The protocols supported for this socket are:
"+Arrays.toString(suppProtocols));
и я получил это в выводе:
[SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2]
Теперь я прочитал, что Java не поддерживает SSLv2, а SSLv2Hello только отправляет приветственное сообщение с использованием SSLv2. Я не могу понять, что это значит? Разве не так же, как если бы клиент поддерживал SSLv2? Как я могу установить SSL-соединение, используя SSLv2.
1 ответ
SSLv3 и TLSv1.x предлагают способ обернуть свое сообщение Client Hello в клиентское Hellov SSLv2, как описано в спецификации TLS: Обратная совместимость с SSL. SSLv3 и TLS 1 и выше имеют более согласованный механизм согласования версии. Как сказано в спецификации TLS:
Возможность отправлять приветственные сообщения клиента версии 2.0 будет полностью прекращена. Разработчики ДОЛЖНЫ приложить все усилия, чтобы двигаться вперед как можно быстрее. Версия 3.0 предоставляет лучшие механизмы для перехода к более новым версиям.
Sun/Oracle JRE или OpenJDK не поддерживают SSLv2. Включение сообщения SSLv3+ в сообщение SSLv2 было сделано только для обеспечения обратной совместимости. Теперь он отключен по умолчанию для клиентов в Java 7. С точки зрения сервера, он может, по крайней мере, принимать других клиентов SSLv3+, которые таким образом переносят свое сообщение Client Hello в сообщение SSLv2, независимо от того, поддерживают они SSLv2 или нет.
Вы найдете более подробную информацию о поддержке Java (включая другие реализации) в этом вопросе.
Вообще говоря, SSLv2 считается небезопасным: его просто не следует использовать. Общая тенденция состоит в том, чтобы перейти от SSLv3 к TLS 1.0 или выше, а не назад.