Zum Inhalt springen
ecdsa.com
Go crypto/x509Go

Fehlermeldung

x509: certificate signed by unknown authority

Go crypto/x509 — returned by Certificate.Verify and TLS dials

Was der Fehler bedeutet

Go hat versucht, vom Zertifikat des Servers eine Kette zu einem Root-Zertifikat aufzubauen, dem es vertraut, und ist gescheitert: Kein Pfad endet bei einem Zertifikat im konfigurierten Root-Pool. Das Zertifikat kann völlig gültig sein – Go hat nur keinen Grund, seinem Aussteller zu vertrauen. Das ist der mit Abstand häufigste TLS-Fehler in Go-Deployments.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    CA zum Root-Pool des Clients hinzufügen

    Erweitere den System-Pool, statt ihn zu ersetzen, damit öffentliche Websites neben deiner internen CA weiter funktionieren.

    go
    roots, err := x509.SystemCertPool()
    if err != nil { roots = x509.NewCertPool() }
    pem, _ := os.ReadFile("internal-ca.pem")
    roots.AppendCertsFromPEM(pem)
    
    client := &http.Client{Transport: &http.Transport{
        TLSClientConfig: &tls.Config{RootCAs: roots},
    }}
  2. 2.

    Server korrigieren: vollständige Kette ausliefern

    Prüfe, was der Server tatsächlich sendet; erscheint nur ein Zertifikat, verweise den Server auf die Fullchain-Datei (zum Beispiel fullchain.pem von Let's Encrypt).

    bash
    openssl s_client -connect api.example.com:443 -showcerts </dev/null \
      | grep -c "BEGIN CERTIFICATE"   # 1 = leaf only (broken), 2+ = chain present
  3. 3.

    CA-Zertifikate im Image mitliefern

    Kopiere bei minimalen Images beim Build ein CA-Bundle hinein. „Löse“ das nie mit InsecureSkipVerify – damit ist die Prüfung komplett abgeschaltet.

    docker
    FROM alpine AS certs
    RUN apk add --no-cache ca-certificates
    
    FROM scratch
    COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen