Pular para o conteúdo
ecdsa.com
Go crypto/x509Go

Mensagem de erro

x509: certificate is valid for example.com, not api.example.com

Os dois nomes são preenchidos a cada falha: primeiro os nomes que o certificado cobre, depois o nome que seu cliente pediu.

Go crypto/x509 — HostnameError from VerifyHostname / TLS dials

O que significa

A conexão TLS avançou o suficiente para ler o certificado, mas nenhum dos Subject Alternative Names (SANs) dele corresponde ao nome de host ao qual o cliente se conectou. O erro lista os dois lados, então a diferença aparece na hora: o certificado cobre X, você pediu Y. Repare que a verificação moderna usa apenas SANs — o campo legado Common Name é ignorado.

Por que acontece

Como corrigir

  1. 1.

    Reemitir com todos os nomes que você realmente usa

    Inclua todos os nomes de host como SANs na emissão; examine a lista de SANs atual para ver o que está coberto hoje.

    bash
    echo | openssl s_client -connect host:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -ext subjectAltName
    # request with SANs:
    openssl req -new -key key.pem -out req.csr \
      -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:api.example.com"
  2. 2.

    Conectar pelo nome ou definir ServerName explicitamente

    Quando o endereço de rede precisa ser diferente do nome do certificado (VIP, port-forward, sidecar), mantenha a verificação honesta informando ao TLS qual identidade você espera.

    go
    conn, err := tls.Dial("tcp", "10.0.0.5:443", &tls.Config{
        ServerName: "api.example.com",   // matched against SANs, sent as SNI
    })

Erros relacionados

Ver toda a base de erros de assinatura