Aller au contenu
ecdsa.com
.NET SslStream / HttpClient.NET

Message d’erreur

The remote certificate is invalid because of errors in the certificate chain: PartialChain

Cet indicateur est souvent combiné à d’autres, par exemple « PartialChain, RevocationStatusUnknown ». HttpClient l’enveloppe dans « The SSL connection could not be established, see inner exception. »

.NET SslStream / HttpClient — X509ChainStatusFlags.PartialChain: the chain could not be built up to a root

Ce que cela signifie

.NET n’a pas pu construire la chaîne entre le certificat du serveur et une racine, quelle qu’elle soit : il manque un certificat intermédiaire. Même lorsque la racine est approuvée (comme dans la reproduction), le trou entre le certificat feuille et la racine empêche la validation. .NET peut télécharger un certificat intermédiaire manquant à partir de l’URL indiquée dans l’extension Authority Information Access du certificat, lorsqu’elle existe et qu’elle est joignable : l’erreur apparaît donc surtout avec des AC privées, des réseaux verrouillés et des conteneurs.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Vérifier ce que le serveur envoie

    Un seul certificat dans le handshake, émis par une AC intermédiaire, confirme le problème.

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

    Envoyer la chaîne complète depuis le serveur

    Dans notre test, Kestrel (.NET 10) n’envoyait que le certificat feuille lorsqu’il recevait un PEM de chaîne complète par ServerCertificate seul, et envoyait le certificat intermédiaire dès que ServerCertificateChain était défini comme indiqué. Pour IIS, installez le certificat intermédiaire dans le magasin Autorités de certification intermédiaires du serveur pour que Windows l’envoie.

    csharp
    // Kestrel sends intermediates only when they are given as ServerCertificateChain
    builder.WebHost.ConfigureKestrel(k => k.ConfigureHttpsDefaults(o =>
    {
        o.ServerCertificate = X509Certificate2.CreateFromPemFile("fullchain.pem", "server.key");
        var chain = new X509Certificate2Collection();
        chain.ImportFromPemFile("fullchain.pem");   // leaf + intermediates
        o.ServerCertificateChain = chain;
    }));
  3. 3.

    Trouver le certificat intermédiaire manquant

    L’extension AIA du certificat feuille pointe vers le certificat de l’émetteur ; ajoutez-le à la configuration du serveur.

    bash
    # The leaf names where its issuer can be downloaded (Authority Information Access)
    openssl x509 -in server.pem -noout -ext authorityInfoAccess

Erreurs associées

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