Mensagem de erro
SSL routines:tls_post_process_client_hello:no shared cipher
Também aparece como
- SSL_do_handshake() failed (SSL: error:0A0000C1:SSL routines::no shared cipher)
- error:0A0000C1:SSL routines::no shared cipher
O openssl s_server (OpenSSL 3.x) registra “error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:<source>”; o nginx registra “SSL_do_handshake() failed (SSL: error:0A0000C1:SSL routines::no shared cipher) while SSL handshaking” no nível info, por isso a mensagem não aparece com o nível padrão do error_log. O OpenSSL 1.1.1 usava o código 1417A0C1.
OpenSSL (server side: nginx, Apache, Postfix, openssl s_server) — SSL_R_NO_SHARED_CIPHER
O que significa
Esta é a visão do servidor sobre um handshake que falhou: nenhuma das cipher suites do ClientHello do cliente está, ao mesmo tempo, ativada no servidor e utilizável com a chave do certificado do servidor. O servidor então envia handshake_failure (alerta 40) ao cliente. A mensagem aparece nos logs do servidor, não na saída do cliente.
Por que acontece
A lista de cifras não combina com o tipo de chave do certificado
comumUm certificado ECDSA com apenas cipher suites ECDHE-RSA-* ativadas (ou um certificado RSA com apenas ECDHE-ECDSA-*) não deixa nenhuma cipher suite TLS 1.2 utilizável, então todo cliente TLS 1.2 falha.
Uma lista de cifras enxugada à mão exclui clientes reais
comumListas reduzidas a uma ou duas cipher suites, ou só a CHACHA20, barram clientes (e ferramentas de monitoramento) que preferem outras cipher suites modernas.
Clientes muito antigos
ocasionalClientes limitados a cipher suites com troca de chaves RSA, com CBC ou com 3DES (Java antigo, dispositivos embarcados) não conseguem se conectar a uma configuração moderna; decida conscientemente se vai oferecer suporte a eles.
Como corrigir
- 1.
Conferir se a chave do certificado combina com as cipher suites
As cipher suites ECDHE-ECDSA-* exigem um certificado ECDSA, e as ECDHE-RSA-*, um certificado RSA; servidores com os dois certificados podem listar as duas famílias.
bash # ECDSA key + only ECDHE-RSA suites (or the reverse) leaves nothing usable openssl x509 -in server.pem -noout -text | grep 'Public Key Algorithm' openssl ciphers -v 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256' - 2.
Listar as cipher suites que o servidor realmente aceita
Enumere-as de fora e compare o resultado com os clientes que você precisa atender.
bash # Which TLS 1.2 suites does the server accept? (nmap needed) nmap --script ssl-enum-ciphers -p 443 api.example.com - 3.
Usar uma lista de cipher suites bem testada
Parta de uma configuração gerada, moderna ou intermediária, em vez de enxugar listas à mão.
text # nginx: suites for both RSA and ECDSA certificates, TLS 1.3 enabled 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;