2015-05-11 2 views
4

Я пытаюсь вызвать защищенную SSL веб-службу, запущенную на JDK7/WildFly 8.2, с помощью клиента на базе Java 6 (обновление 31).SSLv2Hello - javax.net.ssl.SSLException: получено фатальное предупреждение: unexpected_message

Первая проблема, которую я столкнулся на клиенте был:

javax.net.ssl.SSLException: Получен фатальным предупреждение: unexpected_message

Устанавливая javax.net.debug к all с обеих сторон, я получил следующий намек на стороне сервера:

javax.net.ssl.SSLHandshakeException: SSLv2Hello отключена

Краткое исследование shows что

SSLv2Hello отключен по умолчанию на клиенте: В Java SE 7, SSLv2Hello удаляется из списка протоколов по умолчанию включен на клиенте.

Так что я попытался включить SSLv2Hello на WildFly в standalone.xml:

<https-listener name="https" 
       socket-binding="https" 
       security-realm="UndertowRealm" 
       enabled-protocols="SSLv2, SSLv2Hello, TLSv1, TLSv1.1, TLSv1.2" 
       /> 

И результат на сервере:

javax.net.ssl.SSLHandshakeException: Нет соответствующий протокол (протокол отключен или блокировки шифров неуместны)

Так я понимаю, я должен пытаться заставить TLS на клиента вместо включения SSLv2Hello на сервере. Я попытался установить System.setProperty("https.protocols", "TLSv1"); перед вызовом веб-службы без эффекта.

Что мне нужно настроить и как, чтобы получить рукопожатие?

Я напечатал поддерживаемые шифры от значения по умолчанию SSLSocketFactory на сервере:

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 
TLS_RSA_WITH_AES_128_CBC_SHA, 
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, 
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 
TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, 
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 
SSL_RSA_WITH_3DES_EDE_CBC_SHA, 
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, 
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, 
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 
TLS_ECDHE_RSA_WITH_RC4_128_SHA, 
SSL_RSA_WITH_RC4_128_SHA, 
TLS_ECDH_ECDSA_WITH_RC4_128_SHA, 
TLS_ECDH_RSA_WITH_RC4_128_SHA, 
SSL_RSA_WITH_RC4_128_MD5, 
TLS_EMPTY_RENEGOTIATION_INFO_SCSV 
+0

Вы должны проверить сервер, на котором поддерживаются протоколы и шифровые комплекты: https://www.ssllabs.com/ssltest/ – Robert

+0

@Robert Поскольку у меня есть локальный сервер, я не могу использовать предоставленный вами инструмент. Я добавил список шифров * по умолчанию для 'SSLSocketFactory'. –

+0

Если это локальный сервер, используйте инструмент «sslyze» и/или попросите пользователя сервера настроить сервер. И если сервер не поддерживает TLS1.1/1.2, удалите адмирал ... BTW. Java 6 и 7 устарели. Используйте только Java 8. – Robert

ответ

-1

Вы могли бы включить протокол SSLv2 на JVM, но это крайне нежелательно, потому что это серьезная угроза безопасности.

Клиенты используют устаревший и небезопасный протокол и должны обновляться до TLSv1.1 или TLSv.1.2. Для этого потребуется хотя бы Java 7, но Java 8 будет лучше, как сказал Роберт.

Дополнительная информация может быть найдена по адресу https://blogs.oracle.com/java-platform-group/entry/diagnosing_tls_ssl_and_https, включая таблицу поддерживаемых протоколов TLS по версии.

+0

Вы не можете активировать SSLv2 на клиенте. Sun/Oracle Java никогда не поддерживал его. – EJP

+0

Я должен был бы что SSLv2Hello был включен в более старых версиях Java и отключен на Java 7. Все еще может быть повторно подключен, если необходимо. –

+0

Я уже упоминал, что месяц назад. SSLv2Hello - это не то же самое, что SSLv2. Java никогда не поддерживал SSLv2. а не «использовать устаревший и небезопасный протокол». Они используют SSLv2Hello в качестве меры совместимости. - EJP 1 час назад – EJP

1

Вам не нужно включать SSLv2 на сервер.Вам нужно отключить SSLv2Hello псевдо -Протокол на клиента, путем удаления SSLv2Hello из включенных протоколов TLS и оставляя другие:

System.setProperty("https.protocols", "TLSv1,TLSV1.1,TLSV1.2"); 

и, возможно, SSLv3, если это делает его счастливым: это будет не намного дольше, поэтому постарайтесь не делать этого.

Обратите внимание, что это псевдо-протокол. Это не SSLv2, это мера совместимости, позволяющая некоторым, возможно, сломанным серверам, принять привет. Однако сеанс работает на SSLv3 или выше. Он также устарел.

+0

Предостережение: sysprop 'https.p rotocols' работает только с кодом, используя 'HttpsUrlConnection' (в том числе косвенно), или Apache httpclient, если код выбирает useSystemProperties. Для других библиотек или отдельного кода может потребоваться другая настройка или даже изменение кода. –

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