Zum Inhalt springen
ecdsa.com
Java (JSSE)Java

Fehlermeldung

The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

Auch ausgegeben als

  • javax.net.ssl.SSLHandshakeException: (protocol_version) The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

Die gewählte Version (TLS10, TLS11) und die Liste in eckigen Klammern hängen vom Server und von den in der JVM aktivierten Protokollen ab. JDK 21 und neuer stellen dem Text der Exception „(protocol_version) “ voran. Server, die ablehnen, statt auf eine ältere Version herunterzustufen, führen zu „Received fatal alert: protocol_version“.

Java (JSSE) — the server picked a TLS version the JVM does not allow

Was der Fehler bedeutet

Die JVM hat TLS 1.3 und 1.2 angeboten, doch der Server hat das ignoriert und mit TLS 1.0 (TLS10) oder 1.1 (TLS11) geantwortet, was die JVM nicht akzeptiert. Java bricht den Handshake auf der eigenen Seite ab. Der Server ist für aktuelle Clients zu alt; aktuelle JDKs, Browser und curl reagieren alle genauso.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    TLS 1.2 oder neuer auf dem Server aktivieren

    Das ist die Lösung, die jedem Client hilft. TLS 1.0 und 1.1 sind formell abgekündigt (RFC 8996).

    text
    # Enable TLS 1.2 (and 1.3) on the server or appliance
    ssl_protocols TLSv1.2 TLSv1.3;                 # nginx
    SSLProtocol -all +TLSv1.2 +TLSv1.3             # Apache httpd
  2. 2.

    Bestätigen, dass TLS 1.2 fehlt

    Scheitert ein Handshake mit TLS 1.2, während TLS 1.0 gelingt, muss der Server aktualisiert werden.

    bash
    echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -tls1_2 -brief
  3. 3.

    Letzter Ausweg: TLS 1.0/1.1 in einer einzelnen, isolierten JVM zulassen

    Eine Überschreibung der Security Properties, die vom eigenen Wert des JDK ausgeht, aktiviert die alten Versionen nur für diese JVM wieder. TLS 1.0/1.1 beruhen auf SHA-1- und CBC-Konstruktionen mit bekannten Schwächen; beschränke das deshalb auf ein vertrauenswürdiges Netz und entferne es, sobald das Gerät ersetzt ist.

    bash
    # Last resort for ONE JVM that must reach the legacy server: drop TLSv1/TLSv1.1 from
    # this JDK's own jdk.tls.disabledAlgorithms value and pass it as an override
    v=$(sed -n '/^jdk.tls.disabledAlgorithms=/,/[^\\]$/p' "$JAVA_HOME/conf/security/java.security" | sed 's/\\$//' | tr -d '\n')
    printf '%s\n' "$v" | sed -E 's/ TLSv1(\.1)?,//g' > legacy-tls.security
    java -Djava.security.properties=legacy-tls.security -jar legacy-client.jar

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen