Message d’erreur
remote error: tls: handshake failure
Dans les clients HTTP, la ligne se présente ainsi : « Get \"https://…\": remote error: tls: handshake failure ». Go utilise la même forme « remote error: tls: <alert> » côté serveur, dans les lignes de journal « http: TLS handshake error from … », lorsqu’un client envoie une alerte.
Go crypto/tls client — the server sent TLS alert 40 (handshake_failure)
Ce que cela signifie
Le message « remote error » signifie que l’autre partie a envoyé une alerte TLS ; ici, le serveur a envoyé l’alerte 40 (handshake_failure) au client Go. Le serveur a rejeté les paramètres proposés par Go (suites de chiffrement, groupes, algorithmes de signature) ou a exigé un certificat client que Go n’a pas envoyé. Go ne peut pas savoir lequel des deux ; le journal du serveur, si.
Pourquoi cela se produit
Aucune suite de chiffrement commune
fréquenteLa liste par défaut du client Go ne contient ni suites à échange de clés RSA, ni suites CBC, ni suites 3DES ; les serveurs limités à celles-ci n’ont rien en commun avec elle.
Le serveur exige un certificat client
fréquenteLes serveurs TLS 1.2 en mode TLS mutuel répondent souvent à un certificat absent par handshake_failure.
SNI non accepté
occasionnelleUne connexion par adresse IP sans ServerName, ou avec un nom que le serveur ne sert pas, peut déclencher l’alerte sur les CDN et les proxys.
Comment corriger l’erreur
- 1.
Comparer les suites de chiffrement
tls.CipherSuites() liste les suites que Go juge sûres et qu’il propose ; comparez-les avec la configuration du serveur.
go // What does this Go client offer by default? for _, s := range tls.CipherSuites() { fmt.Println(s.Name) } - 2.
Envoyer un certificat client pour le TLS mutuel
Chargez le certificat et la clé avec tls.LoadX509KeyPair, puis placez-les dans tls.Config.Certificates.
go // Mutual TLS: present a client certificate cert, err := tls.LoadX509KeyPair("client.pem", "client.key") if err != nil { log.Fatal(err) } client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{ Certificates: []tls.Certificate{cert}, }}} - 3.
Propriétaires de serveurs : moderniser les suites
TLS 1.3 et les suites TLS 1.2 fondées sur ECDHE fonctionnent avec toutes les versions actuelles de Go.
text Server side: enable TLS 1.3 and TLS 1.2 ECDHE suites with AES-GCM or ChaCha20-Poly1305.