Pular para o conteúdo
ecdsa.com
Ruby openssl (Net::HTTP verify_hostname, default true)Ruby

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

Como corrigir

  1. 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. 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. 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"

Erros relacionados

Ver toda a base de erros de assinatura