Сообщение об ошибке
javax.net.ssl.SSLHandshakeException: (protocol_version) Received fatal alert: protocol_version
Также выводится как
- javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
JDK 21 и более поздние версии добавляют название оповещения в скобках. Если же сервер выбирает версию, которую JVM отвергает, Java сообщает «The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]».
Java (JSSE) — TLS alert 70 received from the server
Что это означает
Сервер отклонил версии TLS, которые предложила JVM, и ответил оповещением 70 (protocol_version). Современные JDK предлагают только TLS 1.3 и 1.2 (1.0 и 1.1 перечислены в jdk.tls.disabledAlgorithms), поэтому у сервера, ограниченного старыми версиями, нет с ними ни одной общей версии.
Почему это происходит
Сервер поддерживает только TLS 1.0 или 1.1
частоУстаревшие специализированные устройства, старые серверы IIS или Java и встраиваемые устройства, так и не получившие поддержку TLS 1.2.
Клиенту жёстко заданы версии, отключённые на сервере
иногдаСтарые скрипты запуска задают https.protocols или jdk.tls.client.protocols равным TLSv1 ради давно выведенной из эксплуатации системы; современные серверы такую версию отклоняют.
Как исправить
- 1.
Выясните, какие версии принимает сервер
Проверьте каждую версию через openssl s_client, затем исправьте ту сторону, которая устарела.
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%-7s ' "$v" echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -"$v" \ -cipher 'DEFAULT:@SECLEVEL=0' >/dev/null 2>&1 && echo accepted || echo refused done - 2.
Снимите жёсткую привязку к протоколам на клиенте
Найдите https.protocols или jdk.tls.client.protocols в скриптах запуска и параметрах JVM; разрешите TLSv1.3 и TLSv1.2.
bash # Do not pin old versions on the client; let JSSE offer 1.3 and 1.2 grep -rn 'https.protocols\|jdk.tls.client.protocols' /etc/default/app* "$JAVA_HOME/conf" 2>/dev/null java -Djdk.tls.client.protocols=TLSv1.3,TLSv1.2 -jar app.jar - 3.
Включите TLS 1.2 и 1.3 на сервере
Долгосрочное решение: все актуальные клиенты поддерживают эти версии.
text # Server side: enable TLS 1.2 and 1.3 ssl_protocols TLSv1.2 TLSv1.3;