Saltar al contenido
ecdsa.com
Go crypto/tls clientGo

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

Cómo solucionarlo

  1. 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. 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. 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.

Errores relacionados

Explorar toda la base de datos de errores de firma