Перейти к содержимому
ecdsa.com
Java (JSSE)Java

Сообщение об ошибке

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), поэтому у сервера, ограниченного старыми версиями, нет с ними ни одной общей версии.

Почему это происходит

Как исправить

  1. 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. 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. 3.

    Включите TLS 1.2 и 1.3 на сервере

    Долгосрочное решение: все актуальные клиенты поддерживают эти версии.

    text
    # Server side: enable TLS 1.2 and 1.3
    ssl_protocols TLSv1.2 TLSv1.3;

Связанные ошибки

Открыть всю базу ошибок подписей