Fehlermeldung
tls: client offered only unsupported versions: [301]
net/http gibt die Meldung als „http: TLS handshake error from <client address>: tls: client offered only unsupported versions: [301]“ aus; die Liste zeigt jede Version, die der Client angeboten hat (300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1).
Go crypto/tls server (net/http ErrorLog) — the client offered only TLS versions below the server's minimum
Was der Fehler bedeutet
Ein Go-TLS-Server hat ein ClientHello erhalten, das nur Protokollversionen unterhalb seines Minimums angeboten hat, hier TLS 1.0 (Versionscode 301). Go-Server akzeptieren standardmäßig TLS 1.2 und 1.3, deshalb wird der Handshake mit dem Alert protocol_version abgelehnt, und net/http protokolliert diese Zeile. Der Client auf der anderen Seite ist veraltet oder sondiert den Server gezielt.
Warum der Fehler auftritt
Veraltete Clients
häufigAltgeräte, alte Anwendungen auf Java 6/7 oder dem .NET Framework und eingebettete HTTP-Clients, die kein TLS 1.2 beherrschen.
Internet-Scanner und Sicherheitstools
häufigScanner bieten absichtlich alte Versionen an, um Server zu klassifizieren; solche Zeilen von vielen verschiedenen Adressen sind auf öffentlichen Endpunkten zu erwarten.
Clients, die auf eine alte Version festgelegt sind
gelegentlichAnwendungen, deren Protokolleinstellung für eine längst abgeschaltete Legacy-Integration auf TLS 1.0 festgelegt wurde.
So behebst du den Fehler
- 1.
Herausfinden, wer sie sendet
Gruppiere die Logzeilen nach Client-Adresse: Wenige bekannte Adressen bedeuten veraltete Clients, die du aktualisieren solltest; viele unbekannte Adressen bedeuten Scanner.
bash # Which addresses send these handshakes, and how often? journalctl -u myservice --since today | grep 'client offered only unsupported versions' \ | grep -oE 'from [0-9a-f.:]+' | sort | uniq -c | sort -rn | head - 2.
TLS 1.2 als Minimum des Servers beibehalten
Senke MinVersion nicht, um Scannern entgegenzukommen; aktualisiere stattdessen die wenigen legitimen alten Clients.
go // Keep TLS 1.2 as the minimum (Go's server default); set it explicitly to document intent srv := &http.Server{Addr: ":443", TLSConfig: &tls.Config{MinVersion: tls.VersionTLS12}} - 3.
Handshake-Rauschen abtrennen
http.Server.ErrorLog erhält die Handshake-Fehler; leitest du es auf einen eigenen Logger um, bleiben die Anwendungslogs lesbar.
go // Route handshake noise from scanners to a separate logger instead of the main log srv.ErrorLog = log.New(handshakeLogWriter, "tls: ", 0)