Fehlermeldung
x509: certificate relies on legacy Common Name field, use SANs instead
Auch ausgegeben als
- tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
Bei TLS-Verbindungen (Go 1.20+) steht vor dem Text das Präfix „tls: failed to verify certificate: “, und HTTP-Clients ergänzen „Get \"https://…\": “. Mit Go gebaute Programme (kubectl, Terraform, Docker, Prometheus, Vault CLI) geben denselben Text aus.
Go crypto/x509 — HostnameError for a certificate without subjectAltName (Go 1.15+)
Was der Fehler bedeutet
Das Zertifikat des Servers hat keine Erweiterung Subject Alternative Name, deshalb steht der Hostname nur im Common Name des Subjects. Go akzeptiert seit Go 1.15 (vollständig seit 1.17) keine Hostnamen aus dem Common Name mehr, gemäß RFC 6125 und den Regeln des CA/Browser Forum, und sagt das ausdrücklich, wenn der CN gepasst hätte. Abhilfe schafft ein Zertifikat mit SANs; einen Schalter auf der Client-Seite gibt es nicht mehr.
Warum der Fehler auftritt
Das Zertifikat wurde ohne subjectAltName erzeugt
häufigopenssl req -x509 -subj "/CN=host" ohne -addext subjectAltName oder openssl x509 -req, das einen CSR ohne -copy_extensions/-extfile signiert, erzeugt genau diese Art von Zertifikat.
Ein internes CA-Profil aus der Zeit vor der SAN-Pflicht
häufigAlte Vorlagen der Active Directory Certificate Services, Legacy-Skripte und CAs in Appliances stellen oft Zertifikate nur mit CN aus.
Selbst erzeugte Zertifikate von Geräten und alter Software
gelegentlichManche Appliances, Datenbanken und Middleware-Produkte erzeugen beim ersten Start Zertifikate nur mit CN.
So behebst du den Fehler
- 1.
Bestätigen, dass die SAN-Erweiterung fehlt
Gib Subject und subjectAltName des ausgelieferten Zertifikats aus.
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.
Mit subjectAltName neu ausstellen
Trage jeden DNS-Namen (und jede IP-Adresse, falls Clients eine verwenden) in subjectAltName ein. Beim Signieren von CSRs mit openssl x509 -req gehen die Erweiterungen aus dem CSR verloren, sofern du nicht -copy_extensions copy oder ein -extfile übergibst.
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.
Nicht nach einem Go-Flag suchen
Der vorübergehende Notausgang GODEBUG=x509ignoreCN=0 wurde in Go 1.17 entfernt, daher bleibt das Neuausstellen des Zertifikats die einzige Lösung.
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.
Verwandte Fehler
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)