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
Le certificat a été généré sans subjectAltName
fréquenteopenssl req -x509 -subj "/CN=host" sans -addext subjectAltName, ou openssl x509 -req qui signe une CSR sans -copy_extensions/-extfile, produit exactement ce type de certificat.
Un profil d’AC interne antérieur à l’exigence de SAN
fréquenteLes anciens modèles d’Active Directory Certificate Services, les vieux scripts et les AC intégrées aux équipements émettent souvent des certificats ne comportant qu’un CN.
Certificats autogénérés par des équipements et d’anciens logiciels
occasionnelleCertains équipements, bases de données et middlewares génèrent au premier démarrage des certificats ne comportant qu’un CN.
Comment corriger l’erreur
- 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.
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.
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
x509: certificate is valid for example.com, not api.example.comGo crypto/x509x509: certificate is not valid for any names, but wanted to match api.example.c…Go crypto/x509No subject alternative names presentJava (JSSE HostnameChecker)tls: failed to verify certificate: x509: certificate signed by unknown authorityGo crypto/tls (Go ≥ 1.20)