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
Le serveur n’envoie que son certificat feuille
fréquenteKestrel, des liaisons IIS ou des proxys inverses configurés avec un fichier de certificat ou un PFX qui ne contient que le certificat feuille.
Le certificat intermédiaire ne peut pas être récupéré
occasionnelleLes AC privées n’ont souvent pas d’URL AIA, et les hôtes ou conteneurs derrière un pare-feu ne peuvent pas joindre les URL AIA publiques : .NET ne peut donc pas combler le trou lui-même.
Le certificat intermédiaire n’existe que sur d’autres machines
occasionnelleSous Windows, les certificats intermédiaires mis en cache ou installés dans le magasin CertificateAuthority font fonctionner la chaîne sur certaines machines, alors qu’elle échoue sur des serveurs fraîchement installés ou dans des conteneurs Linux.
Comment corriger l’erreur
- 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.
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.
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