Mensaje de error
remote error: tls: handshake failure
En los clientes HTTP, la línea dice «Get \"https://…\": remote error: tls: handshake failure». Go usa la misma forma «remote error: tls: <alert>» en los servidores, en las líneas de registro «http: TLS handshake error from …», cuando un cliente envía una alerta.
Go crypto/tls client — the server sent TLS alert 40 (handshake_failure)
Qué significa
El texto «remote error» significa que el otro lado envió una alerta TLS; aquí el servidor envió la alerta 40 (handshake_failure) al cliente Go. El servidor rechazó los parámetros que ofreció Go (conjuntos de cifrado, grupos, algoritmos de firma) o exigió un certificado de cliente que Go no envió. Go no puede saber cuál de las dos cosas ocurrió; el registro del servidor, sí.
Por qué ocurre
Ningún conjunto de cifrado en común
frecuenteLa lista predeterminada del cliente de Go no incluye conjuntos con intercambio de claves RSA, CBC ni 3DES; los servidores limitados a ellos no tienen nada en común con ella.
El servidor exige un certificado de cliente
frecuenteLos servidores TLS 1.2 en modo TLS mutuo suelen responder con handshake_failure cuando falta el certificado.
SNI no aceptado
ocasionalConectarse por IP sin ServerName, o con un nombre que el servidor no sirve, puede provocar la alerta en CDN y proxies.
Cómo solucionarlo
- 1.
Comparar los conjuntos de cifrado
tls.CipherSuites() enumera lo que Go considera seguro y ofrece; compáralo con la configuración del servidor.
go // What does this Go client offer by default? for _, s := range tls.CipherSuites() { fmt.Println(s.Name) } - 2.
Enviar un certificado de cliente para TLS mutuo
Carga el certificado y la clave con tls.LoadX509KeyPair y asígnalos en 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.
Propietarios del servidor: modernizar los conjuntos de cifrado
TLS 1.3 y los conjuntos de TLS 1.2 basados en ECDHE funcionan con todas las versiones actuales de Go.
text Server side: enable TLS 1.3 and TLS 1.2 ECDHE suites with AES-GCM or ChaCha20-Poly1305.