У меня есть клиент и сервер, настроенный для использования TLS и самозаверяющего сертификата.
Клиентский SSL Engine настроен на использование фиктивного диспетчера доверия, который никогда не генерирует CertificateException и пустой массив KeyManager.
Сервер SSL Engine использует хранилище ключей, которое инициализируется сгенерированным вручную файлом хранилища ключей.
Когда я запускаю его с JDK 8, я получаю следующий результат рукопожатия:
- Сбой серверадля проверки сертификата
- В потоке клиента я вижу, что
io.netty.handler.ssl.SslHandler#setHandshakeFailure
вызывается и io.netty.handler.ssl.SslHandler#setHandshakeSuccess
никогда не вызывается.
Что является ожидаемым поведением.
КогдаЯ запускаю его с JDK 11 и получаю следующее:
- сервер не работает с той же ошибкой (пустая цепочка сертификатов), но в клиентском потоке я вижу следующее:
io.netty.handler.ssl.SslHandler#setHandshakeSuccess
isсначала называется io.netty.handler.ssl.SslHandler#setHandshakeFailure
вызывается после
Я новичок в TLS 1.3 и, возможно, что-то пропустил в конфигурации.В то же время в документации говорится, что обновлять клиенты API Java TLS для переключения на TLS 1.3 не нужно.
Такое поведение сбивает с толку и нарушает дальнейшую логику, основанную на handshakePromise
.
Полный код для воспроизведения проблемы доступен по ссылке: https://gist.github.com/kiturutin/ccb710f67ccfb0a7a7de1fb3b3099b60
Это отличный сценарий, который сначала запускает сервер, а затем клиента.