Mensagem de erro
state=error: certificate verify failed (hostname mismatch)
Também aparece como
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (hostname mismatch)
Mensagem completa: “SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (hostname mismatch)”. O nome de host em si não faz parte da mensagem; compare a URL com o certificado.
Ruby openssl (Net::HTTP verify_hostname, default true) — OpenSSL::SSL::SSLError from SSL_connect
O que significa
A cadeia é confiável, mas o nome de host ao qual o Net::HTTP se conectou não aparece nos Subject Alternative Names do certificado. As versões atuais do Ruby deixam o OpenSSL verificar o nome de host durante o handshake (verify_hostname), por isso o problema aparece como falha na verificação do certificado; versões mais antigas do Ruby lançavam um erro separado, “hostname … does not match the server certificate”, depois da conexão.
Por que acontece
O certificado não cobre este nome
comumSubdomínios, o domínio principal ou hosts renomeados que faltam na lista de SANs.
Conexão por IP ou por um alias interno
comumClientes de banco de dados, Redis ou API configurados com endereços IP ou nomes de contêiner.
O servidor retornou o certificado padrão
ocasionalUm proxy que não conhece o nome solicitado serve o certificado de outro site.
Como corrigir
- 1.
Comparar a lista de SANs com o host
A mensagem não inclui os nomes, então imprima-os a partir do certificado.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Usar o nome do certificado e fixar o endereço
Net::HTTP#ipaddr= conecta a um IP específico, enquanto o SNI e a verificação usam o nome de host.
ruby # Connect to a specific address but verify the certificate's name (Net::HTTP#ipaddr=) http = Net::HTTP.new("www.example.com", 443) http.ipaddr = "10.0.0.5" http.use_ssl = true http.get("/health") - 3.
Reemitir com todos os nomes em uso
Adicione os nomes que faltam ao subjectAltName.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com"