Сбой связи HTTPS, jdk 1.6 (32-разрядный клиент) с сервером jdk 1.8 (64-разрядный): READ: Неизвестно-3.3 Предупреждение, длина = 2
Это мой первый вопрос о stackru. Я пытаюсь установить связь HTTPS между двумя котами:
- Клиент Tomcat, использующий JDK1.6 32 бит.
- Сервер Tomcat, использующий JDK1.8 64 бит.
Код клиента для запроса HTTP:
HttpClient hc = new HttpClient();
hc.startSession(monitAppURL);
int code = hc.executeMethod(poster);
Исключение я получаю:
Получено фатальное предупреждение: handshake_failure
Я получаю более подробное исключение, запустив JVM с -Djavax.net.debug=ssl:handshake:verbose
:
вызвать посев SecureRandom
сделано посева SecureRandom
Разрешить небезопасные пересмотры: правда
Разрешить устаревшие приветственные сообщения: правда
Это начальное рукопожатие: правда
Безопасное пересмотр: правда
Служба мониторинга @dealy::nap 30::30, setSoTimeout(0) вызвана
Служба мониторинга @dealy::nap 30::30, setSoTimeout(0) вызвана
%% Нет кэшированного сеанса клиента
*** ClientHello, TLSv1 RandomCookie: GMT: 1468994533 байт = { 100, 134, 165, 203, 220, 40, 175, 72, 89, 189, 99, 104, 208, 177, 19, 59, 234, 210, 59, 1, 57, 254, 73, 155, 253, 82, 102, 221 } Идентификатор сеанса: {}
Шифров: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WIT _AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CB _SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_S А, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_W TH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]Методы сжатия: {0}
*** Служба мониторинга @dealy::nap 30::30, WRITE: TLSv1 Handshake, длина = 75
Служба мониторинга @dealy:: nap 30:: 30, WRITE: приветственное сообщение клиента SSLv2, длина = 101
Служба мониторинга @dealy::nap 30::30, READ: Неизвестно-3.3 Предупреждение, длина = 2
Служба мониторинга @dealy::nap 30::30, RECV TLSv1 ALERT: смертельно, Handshake_failure
Служба мониторинга @dealy:: nap 30:: 30, называется closeSocket() Служба мониторинга
@dealy:: nap 30:: 30, обработка исключения: javax.net.ssl.SSLHan shakeException: получено фатальное предупреждение: handshake_failure
Я начал свою JVM с set JAVA_OPTS="-Dhttps.protocols="TLSv1" -Djdk.tls.client.protocols="TLSv1" -Dcom.sun.net.ssl.checkRevocation=false -Ddeployment.security.TLSv1=true -Djavax.net.debug=ssl:handshake:verbose -Dsun.security.ssl.allowUnsafeRenegotiation=true -Djdk.tls.enableRC4CipherSuites=true -Ddeployment.security.TLSv1=true -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Но до сих пор не в состоянии получить ошибку ошибки. Я уже провел много времени. Пожалуйста, помогите мне решить эту проблему.
1 ответ
Я нашел решение своей проблемы, 1. Что происходило? В Java 6 по умолчанию для приветствия используется сообщение Hello SSlv2Client, даже если используется протокол TLSv1. Формат сообщения рукопожатия - sslv2Client hello
@dealy:: nap 30:: 30, WRITE: приветственное сообщение клиента SSLv2, длина =101
Мой сервер использует Java 8, с SSLv3 отключен по соображениям безопасности,
jdk.tls.disabledAlgorithms = SSLv3
Это стало причиной сбоя моего сообщения о рукопожатии, так как мой клиент отправлял приветственное сообщение sslv2Client, даже несмотря на то, что для связи был выбран протокол TLSv1.
https://serverfault.com/questions/637880/disabling-sslv3-but-still-supporting-sslv2hello-in-apache
Если вы отключите Sslv3 в jvm, он также отключит поддержку сообщений sslv2Client Hello.
2. Что я сделал? Apache httpClient по умолчанию всегда использует стек протоколов jvm для связи. Вот почему мои аргументы jvm не работали для httpclient.
Итак, я переопределил связь SSL httpclient, добавив следующий код.
SSLContext sslContext = SSLContexts.custom()
.useTLS()
.build();
SSLConnectionSocketFactory f = new SSLConnectionSocketFactory(
sslContext,
new String[]{"TLSv1"},
null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpClient hc = HttpClients.custom()
.setSSLSocketFactory(f)
.build();
и наконец, Apache httpclient запустил сообщение рукопожатия формата TLSv1 для связи.
Я надеюсь, что это поможет кому-то столкнуться с той же проблемой,
Спасибо.