Message d’erreur
tls: server selected unsupported protocol version 301
Le nombre est le code de version en hexadécimal, sans le préfixe 0x : 300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1. Les clients HTTP ajoutent le préfixe « Get \"https://…\": ». Un serveur limité à TLS 1.0 et reposant sur une bibliothèque actuelle refuse au lieu de se replier sur une version inférieure, et Go signale alors « remote error: tls: protocol version not supported » (observé face à openssl s_server -tls1).
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
Ce que cela signifie
Le serveur a répondu au ClientHello de Go en choisissant une version de TLS que le client Go n’autorise pas : 301 est le code de version hexadécimal de TLS 1.0, 302 celui de TLS 1.1. Par défaut (depuis Go 1.18), les clients Go exigent TLS 1.2 ou une version plus récente : ils interrompent donc le handshake. Le serveur doit prendre en charge TLS 1.2 ou une version ultérieure.
Pourquoi cela se produit
Le serveur ne prend en charge que TLS 1.0 ou 1.1
fréquenteÉquipements anciens, appareils embarqués, anciens serveurs Windows et répartiteurs de charge obsolètes.
Le minimum du client Go est TLS 1.2
fréquenteDepuis Go 1.18, la valeur par défaut de tls.Config.MinVersion pour les clients est TLS 1.2 ; les programmes recompilés avec un Go plus récent cessent de communiquer avec les serveurs TLS 1.0 sans la moindre modification de code.
Comment corriger l’erreur
- 1.
Mettre à niveau le TLS du serveur
Activez TLS 1.2 (et 1.3) sur le serveur, ou placez devant lui un proxy de terminaison TLS moderne.
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.
En dernier recours : un client dédié avec MinVersion TLS 1.0
Abaisser MinVersion dans un client utilisé uniquement pour cet appareil ancien rétablit la connectivité. TLS 1.0 est déclaré obsolète (RFC 8996) et dépourvu des protections modernes ; cantonnez ce trafic à des réseaux de confiance et n’appliquez jamais ce réglage à des transports partagés.
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/")