Aller au contenu
ecdsa.com
Go crypto/x509Go

Message d’erreur

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

Également affiché sous la forme

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

Lors des connexions TLS (Go 1.20 et versions ultérieures), le texte est précédé de « tls: failed to verify certificate: », et les clients HTTP ajoutent « Get \"https://…\": ». Les programmes écrits en Go (kubectl, Terraform, Docker, Prometheus, la CLI Vault) affichent le même texte.

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

Ce que cela signifie

Le certificat du serveur n’a pas d’extension Subject Alternative Name : le nom d’hôte ne figure donc que dans le nom commun (CN) du sujet. Go a cessé d’accepter les noms d’hôte issus du nom commun avec Go 1.15 (complètement avec 1.17), conformément à la RFC 6125 et aux règles du CA/Browser Forum, et le dit explicitement lorsque le CN aurait correspondu. La solution est un certificat avec des SAN ; il ne reste aucun réglage côté client.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Confirmer que l’extension SAN est absente

    Affichez le sujet et le subjectAltName du certificat servi.

    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.

    Réémettre avec subjectAltName

    Placez chaque nom DNS (et chaque adresse IP, si les clients en utilisent une) dans subjectAltName. Lors de la signature de CSR avec openssl x509 -req, les extensions de la CSR sont supprimées, sauf si vous passez -copy_extensions copy ou un -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.

    Ne pas chercher d’option Go

    L’échappatoire temporaire GODEBUG=x509ignoreCN=0 a été supprimée dans Go 1.17 : réémettre le certificat est donc la seule solution.

    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.

Erreurs associées

Parcourir toute la base de données des erreurs de signature