Pular para o conteúdo
ecdsa.com
Go crypto/tls clientGo

Mensagem de erro

remote error: tls: handshake failure

Em clientes HTTP, a linha fica “Get \"https://…\": remote error: tls: handshake failure”. O Go usa a mesma forma “remote error: tls: <alert>” nos servidores, em linhas de log “http: TLS handshake error from …”, quando um cliente envia um alerta.

Go crypto/tls client — the server sent TLS alert 40 (handshake_failure)

O que significa

“remote error” significa que o outro lado enviou um alerta TLS; aqui, o servidor enviou o alerta 40 (handshake_failure) ao cliente Go. O servidor rejeitou os parâmetros que o Go ofereceu (cipher suites, grupos, algoritmos de assinatura) ou exigiu um certificado de cliente que o Go não enviou. O Go não tem como saber qual dos dois; o log do servidor mostra.

Por que acontece

Como corrigir

  1. 1.

    Comparar as cipher suites

    O tls.CipherSuites() lista o que o Go considera seguro e oferece; compare com a configuração do servidor.

    go
    // What does this Go client offer by default?
    for _, s := range tls.CipherSuites() {
    	fmt.Println(s.Name)
    }
  2. 2.

    Enviar um certificado de cliente para o TLS mútuo

    Carregue o certificado e a chave com tls.LoadX509KeyPair e coloque-os em 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.

    Donos do servidor: modernizar as cipher suites

    O TLS 1.3 e as cipher suites do TLS 1.2 baseadas em ECDHE funcionam com todas as versões atuais do Go.

    text
    Server side: enable TLS 1.3 and TLS 1.2 ECDHE suites with AES-GCM or ChaCha20-Poly1305.

Erros relacionados

Ver toda a base de erros de assinatura