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
Nenhuma cipher suite em comum
comumA lista padrão do cliente Go não tem cipher suites com troca de chaves RSA, com CBC ou com 3DES; servidores restritos a elas não têm nada em comum com essa lista.
O servidor exige um certificado de cliente
comumServidores TLS 1.2 no modo de TLS mútuo costumam responder com handshake_failure quando falta o certificado.
SNI não aceito
ocasionalConectar por IP sem ServerName, ou com um nome que o servidor não atende, pode disparar o alerta em CDNs e proxies.
Como corrigir
- 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.
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.
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.