Message d’erreur
The remote certificate is invalid because of errors in the certificate chain: NotTimeValid
HttpClient la signale comme exception interne de « The SSL connection could not be established, see inner exception. ». Plusieurs indicateurs peuvent être listés ensemble, par exemple « NotTimeValid, UntrustedRoot ».
.NET SslStream / HttpClient — X509ChainStatusFlags.NotTimeValid
Ce que cela signifie
Un certificat de la chaîne construite par .NET est hors de sa période de validité selon l’horloge de cette machine : il a expiré ou n’est pas encore valide. NotTimeValid n’indique pas de quel certificat il s’agit ; les éléments de la chaîne accessibles dans un callback de validation, eux, l’indiquent. La racine et le nom étaient corrects, sinon d’autres indicateurs apparaîtraient à côté.
Pourquoi cela se produit
Le certificat du serveur (ou un certificat intermédiaire) a expiré
fréquenteLe renouvellement n’a pas eu lieu, ou le certificat renouvelé n’a pas été lié (liaison IIS, configuration Kestrel, référence Azure/Key Vault, répartiteur de charge).
Un certificat tout neuf sur un client dont l’horloge retarde
occasionnelleLes certificats valides à partir de « maintenant » échouent sur les machines qui retardent de quelques minutes.
L’horloge du client est fausse
occasionnelleDes VM restaurées à partir d’instantanés, des appareils sans NTP ou des conteneurs sur un hôte dont l’horloge dérive.
Comment corriger l’erreur
- 1.
Vérifier les dates du certificat servi
Comparez notBefore et notAfter avec l’heure UTC actuelle.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -startdate -enddate - 2.
Journaliser l’élément de chaîne en échec
Un callback de validation qui journalise ChainElementStatus et renvoie la décision par défaut montre quel certificat est hors de ses dates de validité, sans affaiblir la validation.
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.
Renouveler et refaire les liaisons
Renouvelez le certificat et mettez à jour chaque liaison qui le sert.
bash sudo certbot renew && sudo systemctl reload nginx # or renew in your CA / key vault and redeploy