Fehlermeldung
tls: server selected unsupported protocol version 301
Die Zahl ist der Versionscode in Hexadezimalschreibweise ohne das Präfix 0x: 300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1. HTTP-Clients stellen „Get \"https://…\": “ voran. Ein Server, der nur TLS 1.0 kann und auf einer aktuellen Bibliothek aufbaut, lehnt ab, statt auf eine ältere Version herunterzustufen, und Go meldet dann „remote error: tls: protocol version not supported“ (beobachtet mit openssl s_server -tls1 als Gegenstelle).
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
Was der Fehler bedeutet
Der Server hat das ClientHello von Go beantwortet, indem er eine TLS-Version gewählt hat, die der Go-Client nicht zulässt: 301 ist der hexadezimale Versionscode von TLS 1.0, 302 der von TLS 1.1. Go-Clients verlangen standardmäßig TLS 1.2 oder neuer (seit Go 1.18), deshalb brechen sie den Handshake ab. Der Server muss TLS 1.2+ unterstützen.
Warum der Fehler auftritt
Der Server unterstützt nur TLS 1.0 oder 1.1
häufigAlte Appliances, eingebettete Geräte, Legacy-Windows-Server und veraltete Load Balancer.
Das Minimum des Go-Clients ist TLS 1.2
häufigSeit Go 1.18 ist der Standardwert von tls.Config.MinVersion für Clients TLS 1.2; Programme, die mit einem neueren Go neu gebaut werden, sprechen ohne jede Codeänderung nicht mehr mit Servern, die nur TLS 1.0 können.
So behebst du den Fehler
- 1.
TLS des Servers aktualisieren
Aktiviere TLS 1.2 (und 1.3) auf dem Server oder setze einen modernen TLS-Terminator davor.
text Upgrade the server (or the appliance firmware / TLS terminator in front of it) to TLS 1.2 or 1.3. 0x0301 = TLS 1.0, 0x0302 = TLS 1.1, 0x0303 = TLS 1.2, 0x0304 = TLS 1.3. - 2.
Letzter Ausweg: ein eigener Client mit MinVersion TLS 1.0
Senkst du MinVersion in einem Client, der nur für dieses Altgerät verwendet wird, funktioniert die Verbindung wieder. TLS 1.0 ist abgekündigt (RFC 8996) und bietet keine modernen Schutzmechanismen; halte solchen Verkehr in vertrauenswürdigen Netzen und setze diese Einstellung nie auf gemeinsam genutzten Transports.
go // Last resort for one legacy device on a trusted network: a dedicated client legacy := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{ MinVersion: tls.VersionTLS10, // only for this client; never in a shared transport }}} resp, err := legacy.Get("https://legacy.example.com:8443/")