Pular para o conteúdo
ecdsa.com
OpenSSL (client side)CLI do OpenSSL

Mensagem de erro

SSL routines:ssl3_read_bytes:ssl/tls alert handshake failure

Também aparece como

  • SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
  • SSL alert number 40

O OpenSSL 3.3 e posteriores imprimem “ssl/tls alert handshake failure”; as versões anteriores, “sslv3 alert handshake failure” (mesmo código 0A000410; o 1.1.1 usava 14094410). A linha termina com a localização no código-fonte e “SSL alert number 40”.

OpenSSL (client side) — TLS alert 40 (handshake_failure) received from the server

O que significa

O servidor enviou o alerta TLS 40 (handshake_failure) e fechou a conexão. É uma recusa genérica: o servidor não encontrou no ClientHello nenhuma cipher suite, grupo de troca de chaves ou algoritmo de assinatura aceitável, exigiu um certificado de cliente ou rejeitou o nome de servidor solicitado. O cliente não tem como saber o motivo pelo alerta; ele está no log do servidor.

Por que acontece

Como corrigir

  1. 1.

    Ler o log do servidor

    O servidor registra o motivo real, por exemplo, “no shared cipher” ou “peer did not return a certificate”.

    bash
    # The server knows why; with openssl s_server or nginx the log says e.g.
    #   ...:tls_post_process_client_hello:no shared cipher
    #   ...:tls_process_client_certificate:peer did not return a certificate
    sudo tail -n 50 /var/log/nginx/error.log | grep -i ssl
  2. 2.

    Isolar a causa a partir do cliente

    Varie o SNI, a versão do protocolo, a lista de cifras e a presença de um certificado de cliente; a variante que funcionar identifica a peça que falta.

    bash
    h=api.example.com
    echo | openssl s_client -connect $h:443 -servername $h -brief                       # with SNI
    echo | openssl s_client -connect $h:443 -servername $h -tls1_2 -cipher 'ALL:@SECLEVEL=0' -brief
    echo | openssl s_client -connect $h:443 -servername $h -cert client.pem -key client.key -brief   # mTLS
  3. 3.

    Donos do servidor: oferecer cipher suites atuais

    A combinação de TLS 1.3 e TLS 1.2 com cipher suites ECDHE e AEAD funciona com todos os clientes que ainda recebem manutenção.

    text
    # nginx: modern suites for TLS 1.2 plus TLS 1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

Erros relacionados

Ver toda a base de erros de assinatura