Zum Inhalt springen
ecdsa.com
.NET SslStream / HttpClient.NET

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

So behebst du den Fehler

  1. 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. 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. 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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen