Zum Inhalt springen
ecdsa.com
Go crypto/x509Go

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

So behebst du den Fehler

  1. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen