Fehlermeldung
The remote certificate is invalid because of errors in the certificate chain: NotTimeValid
HttpClient meldet den Fehler als innere Exception von „The SSL connection could not be established, see inner exception.“. Mehrere Flags können zusammen aufgeführt sein, etwa „NotTimeValid, UntrustedRoot“.
.NET SslStream / HttpClient — X509ChainStatusFlags.NotTimeValid
Was der Fehler bedeutet
Ein Zertifikat in der Kette, die .NET aufgebaut hat, liegt nach der Uhr dieses Rechners außerhalb seines Gültigkeitszeitraums: abgelaufen oder noch nicht gültig. NotTimeValid sagt nicht, welches Zertifikat betroffen ist; die Kettenelemente in einem Validierungs-Callback schon. Root und Name waren in Ordnung, sonst würden zusätzlich andere Flags erscheinen.
Warum der Fehler auftritt
Das Zertifikat des Servers (oder ein Zwischenzertifikat) ist abgelaufen
häufigDie Erneuerung hat nicht stattgefunden, oder das erneuerte Zertifikat wurde nicht gebunden (IIS-Bindung, Kestrel-Konfiguration, Verweis auf Azure/Key Vault, Load Balancer).
Ein brandneues Zertifikat auf einem Client, dessen Uhr nachgeht
gelegentlichZertifikate, die ab „jetzt“ gültig sind, scheitern auf Rechnern, deren Uhr ein paar Minuten nachgeht.
Die Uhr des Clients geht falsch
gelegentlichAus Snapshots wiederhergestellte VMs, Geräte ohne NTP oder Container auf einem Host, dessen Uhr driftet.
So behebst du den Fehler
- 1.
Gültigkeitsdaten des ausgelieferten Zertifikats prüfen
Vergleiche notBefore und notAfter mit der aktuellen UTC-Zeit.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -startdate -enddate - 2.
Fehlerhaftes Kettenelement loggen
Ein Validierungs-Callback, der ChainElementStatus loggt und die Standardentscheidung zurückgibt, zeigt, welches Zertifikat außerhalb seiner Gültigkeit liegt, ohne die Validierung zu schwächen.
csharp // Log which certificate failed and why, without accepting it var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (msg, cert, chain, errors) => { foreach (var element in chain!.ChainElements) foreach (var status in element.ChainElementStatus) Console.WriteLine($"{element.Certificate.Subject}: {status.Status} {element.Certificate.NotAfter:u}"); return errors == System.Net.Security.SslPolicyErrors.None; }, }; - 3.
Erneuern und neu binden
Erneuere das Zertifikat und aktualisiere jede Bindung, über die es ausgeliefert wird.
bash sudo certbot renew && sudo systemctl reload nginx # or renew in your CA / key vault and redeploy