Java 11 выдает сообщение Unsupported handshake: server_hello_done при соединении HTTPS с сертификатом клиента - PullRequest
0 голосов
/ 28 декабря 2018

У нас есть Java-апплет (работающий под tomcat), который делает звонки третьим лицам.Один из них использует сертификат клиента для аутентификации.Это работало под Java 8, но мы недавно обновили систему до Java 11, и она больше не работает.Ошибка:

Неподдерживаемое сообщение о рукопожатии: server_hello_done

(что странно, поскольку я думал, что server_hello_done была допустимой частью рукопожатия)

У нас возникла проблема с хранилищем ключей Java после обновления.Служба не смогла сказать, что это не был действительный поток PCKS12.Перечисление содержимого с помощью keytool сработало, но с предупреждением

Предупреждение:

Хранилище ключей JKS использует собственный формат.Рекомендуется перейти на PKCS12, который является отраслевым стандартным форматом, используя "keytool -importkeystore -srckeystore / path / to / keystore -destkeystore / path / to / keystore -deststoretype pkcs12"

Мы использовалипредложила команду и теперь она открывает хранилище ключей, но мы получаем ошибку квитирования.

Трассировка стека к нашему коду:

Unsupported handshake message: server_hello_done
javax.net.ssl.SSLProtocolException: Unsupported handshake message: server_hello_done
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:126)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:446)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421)
    at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:178)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:396)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)

Мы используем http-клиент apache (org.apache.http.impl.client.CloseableHttpClient).Следующая строка в трассировке стека - это просто вызов client.execute() в нашем коде.

Он также включает

Caused by: java.lang.UnsupportedOperationException: Not supported yet.
        at java.base/sun.security.ssl.HandshakeHash$CloneableHash.archived(HandshakeHash.java:616)
        at java.base/sun.security.ssl.HandshakeHash$T12HandshakeHash.archived(HandshakeHash.java:546)
        at java.base/sun.security.ssl.HandshakeHash.archived(HandshakeHash.java:188)
        at java.base/sun.security.ssl.CertificateVerify$T12CertificateVerifyMessage.<init>(CertificateVerify.java:581)
        at java.base/sun.security.ssl.CertificateVerify$T12CertificateVerifyProducer.produce(CertificateVerify.java:740)
        at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436)
        at java.base/sun.security.ssl.ServerHelloDone$ServerHelloDoneConsumer.consume(ServerHelloDone.java:173)
        at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
        at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)

Третья сторона подтверждает, что они не видят "общий шифр" в своихжурналы, но говорят, что они поддерживают широкий диапазон шифров ( "SSL3, TLS 1.0, 1.1 или 1.2. Шифры помечены как ВЫСОКИЙ: СРЕДНИЙ:! aNULL:! eNULL: @STRENGTH" ).Я думаю, что мы поддерживаем большую часть этого, кроме SSL3.Насколько я знаю, у нас есть настройки по умолчанию в Java 11 для таких.Пробовал активировать SSLv3 временно, но не смог подключиться (хотя с тех пор, как попытался не установить соединение с этой машины вообще (время ожидания) даже после возврата, так что, может быть, это мало что говорит - я пробовал с тестовой машины, а не рабочей длячто).

Есть идеи?Я на правильных линиях, чтобы продолжать смотреть на шифры, или я что-то упускаю?

1 Ответ

0 голосов
/ 02 января 2019

Оказалось, что все, что нужно, это перезапуск tomcat!Но, поскольку это был производственный сервер, который делал много вещей, я не хотел делать это как первый шаг.Но это исправило.

Мое лучшее предположение относительно того, что произошло, было:

  • Хранилище ключей было в неправильном формате для обновленной версии Java
  • Попыткаиспользование недействительного хранилища ключей переведите tomcat / java в какое-то странное состояние
  • Обновление хранилища ключей позволило java использовать его, но оно все еще находилось в каком-то странном состоянии
  • Перезапустите, чтобы исправить это.

Что действительно странно, так это то, что он вел себя одинаково даже с другим IP (я пробовал на стороннем тестовом сервере) и с другим хранилищем ключей (я сделал копию обновленного хранилища ключей и сделал запрос, который использовалтот).Первоначальной ошибкой было «Поток не является действительным хранилищем ключей PKCS12» и трассировка стека вернулась к строке, которая пыталась открыть хранилище ключей в нашем коде.Исправив формат хранилища ключей, он получил дальнейшее развитие в нашем коде (трассировка стека теперь вернулась к client.execute()), но потерпела неудачу с сообщением рукопожатия _Unsupported: server_hello_done_.

Я создал копию всей папки tomcat (включая jre) с первоначально исходным (недействительным) хранилищем ключей, изменил его для запуска на другом порту и запустил рядом с этим tomcat на той же машине.Он вел себя так же, но затем работал после перезагрузки.Этим утром я перезапустил основной сервис, и теперь он работает

...