Fehlermeldung
The remote certificate is invalid because of errors in the certificate chain: PartialChain
Oft zusammen mit anderen Flags, etwa „PartialChain, RevocationStatusUnknown“. HttpClient verpackt den Fehler in „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
Was der Fehler bedeutet
.NET konnte die Kette vom Zertifikat des Servers nicht bis zu einem Root-Zertifikat aufbauen: Es fehlt ein Zwischenzertifikat. Selbst wenn das Root-Zertifikat vertrauenswürdig ist (wie in der Reproduktion), verhindert die Lücke zwischen Leaf-Zertifikat und Root-Zertifikat die Validierung. .NET kann ein fehlendes Zwischenzertifikat über die URL in der Erweiterung Authority Information Access des Zertifikats herunterladen, sofern es eine gibt und sie erreichbar ist; deshalb tritt der Fehler vor allem bei privaten CAs, abgeschotteten Netzwerken und Containern auf.
Warum der Fehler auftritt
Der Server sendet nur sein Leaf-Zertifikat
häufigKestrel, IIS-Bindungen oder Reverse Proxys, die mit einer Zertifikatsdatei oder PFX konfiguriert sind, die nur das Leaf-Zertifikat enthält.
Das Zwischenzertifikat lässt sich nicht abrufen
gelegentlichPrivate CAs haben oft keine AIA-URL, und Hosts hinter einer Firewall oder Container erreichen die öffentlichen URLs nicht, deshalb kann .NET die Lücke nicht selbst schließen.
Das Zwischenzertifikat gibt es nur auf anderen Rechnern
gelegentlichUnter Windows sorgen Zwischenzertifikate, die im Speicher CertificateAuthority zwischengespeichert oder installiert sind, dafür, dass die Kette auf manchen Rechnern funktioniert und auf frischen Servern oder in Linux-Containern scheitert.
So behebst du den Fehler
- 1.
Prüfen, was der Server sendet
Ein einziges Zertifikat im Handshake, ausgestellt von einer Zwischen-CA, bestätigt das Problem.
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.
Vollständige Kette vom Server senden
In unserem Test sendete Kestrel (.NET 10) nur das Leaf-Zertifikat, wenn ein PEM mit der vollständigen Kette allein über ServerCertificate übergeben wurde, und sendete das Zwischenzertifikat, sobald ServerCertificateChain wie gezeigt gesetzt war. Installiere bei IIS das Zwischenzertifikat im Speicher „Zwischenzertifizierungsstellen“ (Intermediate Certification Authorities) des Servers, damit Windows es mitsendet.
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.
Fehlendes Zwischenzertifikat finden
Die AIA-Erweiterung des Leaf-Zertifikats verweist auf das Zertifikat des Ausstellers; füge es der Serverkonfiguration hinzu.
bash # The leaf names where its issuer can be downloaded (Authority Information Access) openssl x509 -in server.pem -noout -ext authorityInfoAccess