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

Mensagem de erro

x509: certificate relies on legacy Common Name field, use SANs instead

Também aparece como

  • tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

Em conexões TLS (Go 1.20+), o texto recebe o prefixo “tls: failed to verify certificate: ”, e clientes HTTP acrescentam “Get \"https://…\": ”. Programas criados com Go (kubectl, Terraform, Docker, Prometheus, Vault CLI) imprimem o mesmo texto.

Go crypto/x509 — HostnameError for a certificate without subjectAltName (Go 1.15+)

O que significa

O certificado do servidor não tem a extensão Subject Alternative Name, então o nome de host existe apenas no Common Name do titular. O Go deixou de aceitar nomes de host do Common Name no Go 1.15 (por completo no 1.17), seguindo a RFC 6125 e as regras do CA/Browser Forum, e diz isso explicitamente quando o CN teria correspondido. A correção é um certificado com SANs; não resta nenhuma opção no lado do cliente.

Por que acontece

Como corrigir

  1. 1.

    Confirmar que a extensão SAN está ausente

    Imprima o titular e o subjectAltName do certificado servido.

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -subject -ext subjectAltName
    # No "X509v3 Subject Alternative Name" in the output -> reissue the certificate
  2. 2.

    Reemitir com subjectAltName

    Coloque todos os nomes DNS (e endereços IP, se os clientes usarem um) em subjectAltName. Ao assinar CSRs com openssl x509 -req, as extensões do CSR são descartadas, a menos que você passe -copy_extensions copy ou um -extfile.

    bash
    openssl req -new -key server.key -subj "/CN=api.example.com" \
      -addext "subjectAltName=DNS:api.example.com" -out server.csr
    # when signing with "openssl x509 -req", keep the extension:
    openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -days 90 -copy_extensions copy -out server.pem
  3. 3.

    Não procurar uma flag do Go

    A válvula de escape temporária GODEBUG=x509ignoreCN=0 foi removida no Go 1.17, então reemitir o certificado é a única correção.

    text
    GODEBUG=x509ignoreCN=0 only worked in Go 1.15–1.16 and was removed in Go 1.17;
    there is no switch left in current Go releases. The certificate must carry SANs.

Erros relacionados

Ver toda a base de erros de assinatura