Я пытаюсь вызвать защищенную 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
Вы должны проверить сервер, на котором поддерживаются протоколы и шифровые комплекты: https://www.ssllabs.com/ssltest/ – Robert
@Robert Поскольку у меня есть локальный сервер, я не могу использовать предоставленный вами инструмент. Я добавил список шифров * по умолчанию для 'SSLSocketFactory'. –
Если это локальный сервер, используйте инструмент «sslyze» и/или попросите пользователя сервера настроить сервер. И если сервер не поддерживает TLS1.1/1.2, удалите адмирал ... BTW. Java 6 и 7 устарели. Используйте только Java 8. – Robert