#java #ssl #tomcat
Вопрос:
Я получаю javax.net.ssl.SSLException: Received fatal alert: protocol_version
, и если я хорошо понял, это несоответствующая версия протокола шифрования на сервере и клиенте.
Я вижу много решений, таких как настройка System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
где это свойство должно быть установлено, на стороне сервера или на стороне клиента? И как проверить, какой протокол работает как на клиенте, так и на сервере?
Комментарии:
1. Такого рода ошибка также может произойти, если сервер просто не говорит по протоколу TLS, а его ответ, отличный от TLS, неправильно интерпретируется как TLS. Для отладки: попробуйте с другими клиентами, включите отладку TLS в клиенте, посмотрите на трафик с помощью Wireshark, проверьте конфигурации на стороне сервера (совершенно непонятно, что здесь работает) … — это сложно, и простой квитанции не существует.
2. @SteffenUllrich: извините, нет. OpenSSL неправильно диагностирует открытый текст как «неправильная версия», но JSSE говорит «[неподдерживаемое или] непризнанное сообщение TLS», и ни один из них никогда не использует » полученное предупреждение » для чего-либо, кроме полученного предупреждения. (Также вы имеете в виду «рецепт», а не «квитанцию».) OP: подтвердите, что это исходящее соединение, а не входящее (для tomcat)? На какой Java ты работаешь? Как вы пытаетесь установить это соединение: SSLSocket/SSLEngine? HttpsURLConnection? java.net.http. HttpClient? Апачи? Что-то еще? Согласитесь с отладкой, которая выполняется путем настройки sysprop
javax.net.debug=ssl:handshake
3. @dave_thompson_085 спасибо. (Пытался отлаживать локально, где все работает нормально, проблема в производстве, где у меня нет доступа)Я вижу, что и сервер, и клиент здороваются с TLSv1.2. Что может быть не так в производстве? В каком файле конфигурации я могу проверить SSL в Tomcat? А в клиенте? Я подтверждаю, что это исходящее соединение
4. Где вы «видите» 1.2? Вы просматриваете заголовки записей и/или сообщений для ClientHello и ServerHello? Для версии 1.3 те, кто больше не контролирует версию; вместо этого вам нужно посмотреть расширение supported_versions. Как выбираются версии, которые использует/предлагает JSSE, зависит, как я уже намекал, от того, на какой Java вы находитесь и какой тип кода устанавливает соединение-хотя, если один и тот же код работает в тесте на одном и том же сервере , я бы сначала поискал различия в версии Java или конфигурации JRE.