Zum Inhalt springen
ecdsa.com
rustls (via reqwest, ureq, hyper-rustls, tonic)Rust

Fehlermeldung

invalid peer certificate: UnknownIssuer

Auch ausgegeben als

  • InvalidCertificate(UnknownIssuer)

reqwest gibt die Meldung am Ende seiner Kette von Ursachen aus: „error sending request for url (…): client error (Connect): invalid peer certificate: UnknownIssuer“; die Debug-Ausgabe zeigt InvalidCertificate(UnknownIssuer). ureq gibt „io: invalid peer certificate: UnknownIssuer“ aus. Native Binärdateien, die auf rustls aufbauen (pnpm 12, viele CLIs), zeigen denselben Text.

rustls (via reqwest, ureq, hyper-rustls, tonic) — rustls::Error::InvalidCertificate(CertificateError::UnknownIssuer)

Was der Fehler bedeutet

rustls konnte das Zertifikat des Servers mit keinem der Vertrauensanker, mit denen es konfiguriert wurde, zu einer Kette verbinden. UnknownIssuer ist der einzige Code, mit dem rustls jedes Scheitern beim Pfadaufbau meldet: eine private CA oder die CA eines Proxys, ein fehlendes Zwischenzertifikat oder ein selbstsigniertes Zertifikat. Welche Root-Zertifikate als vertrauenswürdig gelten, hängt davon ab, wie das Crate gebaut wurde: mit dem Plattform-Verifier (Zertifikatsspeicher des Betriebssystems), mit rustls-native-certs (Root-Zertifikate des Betriebssystems, beim Start geladen) oder mit webpki-roots (einkompilierte Liste von Mozilla).

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Root-Zertifikat zum Client hinzufügen

    ClientBuilder::add_root_certificate fügt einen Vertrauensanker hinzu und behält die vollständige Prüfung bei (Namen, Gültigkeitsdaten).

    rust
    // Trust a private root for this client (in addition to the default roots)
    let pem = std::fs::read("corp-root-ca.pem")?;
    let client = reqwest::Client::builder()
        .add_root_certificate(reqwest::Certificate::from_pem(&pem)?)
        .build()?;
  2. 2.

    Root-Zertifikat im Zertifikatsspeicher des Systems installieren

    Mit dem Plattform-Verifier (Standard in reqwest 0.13) gelten die Root-Zertifikate im Zertifikatsspeicher des Betriebssystems als vertrauenswürdig; unter Linux genügt update-ca-certificates.

    bash
    # reqwest 0.13 verifies with the platform verifier: install the root in the OS store
    sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt
    sudo update-ca-certificates
  3. 3.

    Prüfen, welche Quelle für Root-Zertifikate einkompiliert ist

    cargo tree zeigt, ob webpki-roots oder rustls-native-certs verwendet wird; stelle die Features um, wenn der Zertifikatsspeicher des Betriebssystems gelten muss.

    bash
    # Which root source is compiled into this binary? (a crate that is absent reports no match)
    cargo tree -e features -i rustls-platform-verifier   # OS verifier (reqwest 0.13 default)
    cargo tree -e features -i rustls-native-certs        # OS roots loaded at start-up
    cargo tree -e features -i webpki-roots               # Mozilla roots compiled in, OS store ignored
  4. 4.

    Eigener Server: Zwischenzertifikat mitsenden

    Steht im Handshake nur ein einziges Zertifikat, dessen Aussteller eine Zwischen-CA ist, dann ist die Konfiguration des Servers unvollständig.

    bash
    openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen