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
Der Server implementiert nur TLS 1.0/1.1
häufigLegacy-Server, Appliances und eingebettete Geräte, deren TLS-Stack älter ist als TLS 1.2 (oder in dem TLS 1.2 abgeschaltet ist).
Eine alte Middlebox, die TLS terminiert
gelegentlichEin Load Balancer oder Proxy vor einem modernen Server terminiert TLS mit einem veralteten Stack.
Das JDK wurde aktualisiert
gelegentlichSicherheitsupdates haben TLS 1.0 und 1.1 im Jahr 2021 in allen gepflegten JDK-Linien deaktiviert; derselbe Server funktionierte mit älteren Updates.
So behebst du den Fehler
- 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.
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.
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
javax.net.ssl.SSLHandshakeException: (protocol_version) Received fatal alert: p…Java (JSSE)No appropriate protocol (protocol is disabled or cipher suites are inappropriat…Java (JSSE)curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocolcurl (OpenSSL backend)tls: server selected unsupported protocol version 301Go crypto/tls client