ERR_SSL_VERSION_OR_CIPHER_MISMATCH: causas e como corrigir
ERR_SSL_VERSION_OR_CIPHER_MISMATCH significa que o navegador e o servidor completaram o suficiente do handshake TLS para comparar as versões de protocolo e as cifras suportadas, e não encontraram nenhuma sobreposição. É um caso mais específico do que uma falha genérica de handshake: os dois lados conversaram, só não conseguiram concordar em como criptografar a conexão.
O que significa ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Durante um handshake TLS, o ClientHello do cliente lista toda versão de TLS e todo conjunto de cifras que está disposto a usar, e o servidor escolhe um dessa lista que também suporta. Esse erro aparece quando a lista do servidor e a lista do cliente não têm nada em comum, quase sempre porque o servidor só oferece opções antigas e obsoletas (TLS 1.0, TLS 1.1, ou cifras como RC4 ou 3DES) que os navegadores atuais se recusam a negociar por motivos de segurança. Os fabricantes de navegadores vêm abandonando o suporte a essas opções mais antigas há anos, então um servidor que nunca atualizou sua configuração TLS falha cada vez mais dessa forma contra visitantes comuns e atualizados.
Como o erro aparece
Chrome e Edge mostram "Esta página não está funcionando - example.com enviou uma resposta inválida" ou, mais especificamente, "ERR_SSL_VERSION_OR_CIPHER_MISMATCH." O Firefox costuma mostrar "A conexão segura falhou" com o código SSL_ERROR_NO_CYPHER_OVERLAP, que nomeia o problema diretamente.
O openssl s_client forçando uma versão específica de TLS mostra exatamente quais versões o servidor aceita e rejeita:
openssl s_client -connect example.com:443 -tls1_2
CONNECTED(00000003)
...
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Verify return code: 0 (ok)
openssl s_client -connect example.com:443 -tls1
CONNECTED(00000003)
140... error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Um alerta de "protocol version" ou "handshake failure" numa versão e uma conexão limpa em outra apontam exatamente quais versões o servidor suporta. O nmap com o script de SSL vai além e lista de uma vez toda cifra que o servidor oferece:
nmap --script ssl-enum-ciphers -p 443 example.com
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_RC4_128_SHA - C
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - A
O que causa o ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- O servidor só oferece TLS 1.0 ou 1.1. Os principais navegadores abandonaram o suporte padrão a ambas as versões há anos; um servidor que nunca atualizou sua configuração agora não compartilha nenhum protocolo em comum com um navegador atual.
- O servidor só oferece cifras fracas ou obsoletas, como RC4 ou 3DES, que os navegadores se recusam a negociar independentemente da versão de TLS oferecida junto.
- Um desencontro de certificado ou SNI em hospedagem compartilhada. Quando vários sites dividem um mesmo endereço IP e o servidor não consegue casar o nome de host solicitado (Server Name Indication) com o certificado e a configuração de cifra corretos, o handshake pode falhar em vez de recorrer a uma opção adequada.
- O estado "no SSL certificate for this hostname yet" do Cloudflare, que aparece quando um domínio foi adicionado ao Cloudflare e o DNS apontou para lá antes da emissão do certificado terminar; a borda ainda não tem nada válido para negociar por aquele nome de host.
- Um sistema operacional ou navegador antigo que só suporta versões de TLS ou cifras mais antigas, contra um servidor moderno que as desativou (corretamente).
Como saber de quem é a culpa
Teste primeiro em outro dispositivo ou outra rede; se o site carregar ali, o sistema operacional ou o navegador do visitante estão desatualizados. Se falha em todo lugar, incluindo num navegador atual e totalmente atualizado, a configuração TLS do servidor é a causa. Uma verificação SSL rodada a partir de vários locais mostra os protocolos e cifras exatos que o servidor oferece a partir de cada ponto de vista numa única passagem, o que é mais rápido do que repetir os comandos openssl manualmente em redes diferentes.
Como corrigir o ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Se você é o visitante
- Atualize seu navegador para a versão mais recente; isso resolve a variante do lado do cliente do desencontro imediatamente.
- Atualize seu sistema operacional, principalmente no Windows 7 ou mais antigo, ou em versões muito antigas de Android e iOS, onde a própria biblioteca TLS do sistema pode estar desatualizada independentemente do navegador.
- Tente outro dispositivo ou rede para confirmar se o problema viaja com você ou fica com o site.
- Fale com o administrador do site se a falha é consistente em todo lugar que você testar; uma configuração de servidor desatualizada precisa ser corrigida daquele lado, não contornada pelo navegador.
Se você administra o site
- Defina explicitamente versões de protocolo e cifras modernas. No nginx:
Remova TLS 1.0, TLS 1.1 e qualquer entrada de cifra RC4 ou 3DES por completo, em vez de apenas colocá-las em ordem de menor prioridade.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; ssl_prefer_server_cipher off; - Se um cliente legado realmente ainda precisa de TLS 1.0 ou 1.1 (alguns terminais de pagamento antigos ou dispositivos embarcados precisam), sirva-o a partir de um nome de host ou listener separado, com seu próprio risco aceito, em vez de enfraquecer a configuração do site principal para todo visitante.
- Verifique a configuração de SNI em hospedagem compartilhada ou num proxy reverso lidando com vários certificados, confirmando que cada bloco
server_namemapeia para o certificado correto e que o proxy não está caindo num certificado padrão que oferece um conjunto de cifras diferente e incompatível. - Se estiver usando Cloudflare e isso começou logo depois de adicionar o domínio, verifique SSL/TLS > Edge Certificates no painel quanto ao status de emissão do certificado; o estado "no SSL certificate for this hostname yet" se resolve sozinho assim que a emissão termina, geralmente em minutos a algumas horas.
- Recarregue depois de qualquer mudança, e confira de novo:
nginx -t && systemctl reload nginx, depois rode de novo os comandos nmap ou openssl acima para confirmar que as versões e cifras antigas realmente sumiram, não só foram reordenadas.
Erros relacionados
- ERR_SSL_PROTOCOL_ERROR é a falha de handshake mais ampla e menos específica: uma resposta sem TLS na porta, dados de handshake malformados, ou software de interceptação, em vez de uma comparação limpa de versão/cifra que simplesmente não encontrou sobreposição.
- ERR_CERT_DATE_INVALID acontece depois que um certificado é de fato recebido e lido, um passo além desse erro, que nunca chega tão longe.
Como prevenir o ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Os fabricantes de navegadores aposentam versões de TLS e cifras mais antigas periodicamente, no próprio ritmo deles, o que significa que uma configuração de servidor que funcionava bem no ano passado pode começar a falhar para uma fatia crescente de visitantes sem nenhuma mudança do lado do servidor. Uma verificação de certificado e SSL reporta o protocolo e a cifra negociados a cada execução, a partir de mais de 300 pontos de verificação em 158 cidades, detectando um servidor que ficou numa configuração obsoleta antes que afete tráfego real. A HostTracker avisa por e-mail, SMS, chamada de voz, Slack, Telegram e outros canais assim que uma verificação falha.
Perguntas frequentes
Isso é o mesmo que um erro de certificado expirado?
Não. Esse erro acontece durante a negociação de protocolo e cifra, antes mesmo de o certificado em si ser avaliado. Um certificado expirado seria um erro separado que ocorre um passo depois no handshake.
Por que isso só afeta visitantes em computadores antigos?
Porque um sistema operacional ou navegador desatualizado pode suportar só TLS 1.0, TLS 1.1, ou cifras mais antigas, que um servidor moderno e devidamente reforçado não oferece mais, gerando um desencontro limpo de versão/cifra específico daquele cliente desatualizado.
Devo reativar o TLS 1.0 para corrigir isso para visitantes antigos?
Geralmente não. TLS 1.0 e 1.1 têm fraquezas conhecidas e a maioria dos navegadores atuais não vai usá-los de qualquer forma, então reativá-los principalmente adiciona risco sem restaurar compatibilidade para a maioria dos visitantes afetados, cujo problema real é um navegador ou sistema operacional desatualizado.
O que exatamente significa a mensagem do Cloudflare "no SSL certificate for this hostname yet"?
Significa que o DNS do domínio já aponta para o Cloudflare, mas a emissão do certificado para aquele nome de host ainda não terminou, então não há nada válido ainda para a borda do Cloudflare apresentar durante o handshake. Costuma se resolver sozinho assim que a emissão termina.
Como sei quais cifras meu servidor oferece atualmente sem ter que adivinhar?
Rode nmap --script ssl-enum-ciphers -p 443 seudominio.com, que lista toda versão de protocolo e cifra que o servidor aceita junto com uma nota para cada uma, em vez de testar as versões uma por uma.