Aller au contenu
ecdsa.com
rustls (via reqwest, ureq, hyper-rustls, tonic)Rust

Message d’erreur

invalid peer certificate: UnknownIssuer

Également affiché sous la forme

  • InvalidCertificate(UnknownIssuer)

reqwest l’affiche à la fin de sa chaîne de causes : « error sending request for url (…): client error (Connect): invalid peer certificate: UnknownIssuer » ; la sortie Debug montre InvalidCertificate(UnknownIssuer). ureq affiche « io: invalid peer certificate: UnknownIssuer ». Les binaires natifs fondés sur rustls (pnpm 12, de nombreux outils CLI) affichent le même texte.

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

Ce que cela signifie

rustls n’a pu rattacher le certificat du serveur à aucune des ancres de confiance avec lesquelles il a été configuré. UnknownIssuer est le code unique de rustls pour tout échec de construction du chemin : une AC privée ou de proxy, un certificat intermédiaire manquant ou un certificat auto-signé. Les racines considérées comme approuvées dépendent de la façon dont la crate a été compilée : le vérificateur de la plateforme (magasin du système d’exploitation), rustls-native-certs (racines du système chargées au démarrage) ou webpki-roots (liste de Mozilla intégrée à la compilation).

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Ajouter la racine au client

    ClientBuilder::add_root_certificate ajoute une ancre tout en conservant une vérification complète (noms, dates).

    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.

    Installer la racine dans le magasin du système d’exploitation

    Avec le vérificateur de la plateforme (par défaut dans reqwest 0.13), les racines du magasin du système d’exploitation sont approuvées ; sous Linux, update-ca-certificates suffit.

    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.

    Vérifier quelle source de racines est compilée

    cargo tree indique si webpki-roots ou rustls-native-certs est utilisé ; modifiez les fonctionnalités (features) activées si le magasin du système d’exploitation doit s’appliquer.

    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.

    Propriétaires de serveurs : envoyer le certificat intermédiaire

    Un seul certificat dans le handshake, dont l’émetteur est une AC intermédiaire, signifie que la configuration du serveur est incomplète.

    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:'

Erreurs associées

Parcourir toute la base de données des erreurs de signature