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
Nenhuma cipher suite em comum
comumServidores legados restritos a cipher suites com troca de chaves RSA, com 3DES ou com RC4; ou servidores rigorosos que permitem só algumas cipher suites que um cliente antigo não tem.
O servidor exige um certificado de cliente (TLS 1.2)
comumNo TLS 1.2, muitos servidores respondem a um certificado de cliente ausente ou inaceitável com handshake_failure; servidores TLS 1.3 usam certificate_required (alerta 116) em vez disso.
SNI ausente ou desconhecido
ocasionalO openssl s_client só envia SNI quando o host é um nome ou quando -servername é informado; CDNs e proxies multilocatários abortam handshakes sem um nome conhecido.
Nenhum grupo ou algoritmo de assinatura em comum
raraServidores restritos a um único grupo (por exemplo, um híbrido pós-quântico) ou a assinaturas RSA-PSS podem falhar com clientes que não oferecem nenhum dos dois.
Como corrigir
- 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.
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.
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
SSL routines:tls_post_process_client_hello:no shared cipherOpenSSL (server side: nginx, Apache, Postfix, openssl s_server)SSL routines:tls_process_client_certificate:peer did not return a certificateOpenSSL (server side, mutual TLS)curl: (35) TLS connect error: error:0A000410:SSL routines::ssl/tls alert handsh…curl (OpenSSL backend)[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] ssl/tls alert handshake failurePython ssl module (OpenSSL)