Message d’erreur
curl: (60) SSL certificate problem: certificate has expired
Également affiché sous la forme
- curl: (60) SSL certificate OpenSSL verify result: certificate has expired (10)
Le texte de la raison est identique dans les builds de curl avec OpenSSL 1.1.1, 3.0 et 3.5. Les versions plus récentes de curl (8.22.0 dans notre test) le formulent « SSL certificate OpenSSL verify result: certificate has expired (10) ». Les certificats qui ne sont pas encore valides produisent une autre raison : « certificate is not yet valid ».
curl (OpenSSL backend) — CURLE_PEER_FAILED_VERIFICATION, X509_V_ERR_CERT_HAS_EXPIRED (10)
Ce que cela signifie
L’un des certificats de la chaîne construite par curl a une date notAfter antérieure à l’heure actuelle de la machine qui exécute curl. Il s’agit généralement du certificat du serveur lui-même, mais un certificat intermédiaire ou une racine à signature croisée qui a expiré produit le même texte. La vérification se fait par rapport à l’horloge locale : une horloge fausse ressemble donc exactement à un certificat expiré.
Pourquoi cela se produit
Le renouvellement automatique a cessé de fonctionner
fréquenteDes tâches planifiées de certbot jamais activées, des challenges ACME qui échouent désormais derrière un CDN ou un pare-feu, un jeton d’API DNS expiré, ou une procédure manuelle dont personne n’est responsable. La durée de vie des certificats publics se réduit à 200 jours en 2026 et à 47 jours d’ici 2029 : les échecs silencieux de renouvellement se manifestent donc vite.
Le certificat a été renouvelé, mais le serveur sert toujours l’ancien
fréquentenginx, HAProxy, Postfix et les serveurs Java chargent le certificat au démarrage. Un fichier renouvelé sur le disque ne change rien tant que le processus n’est pas rechargé ; les répartiteurs de charge et les CDN conservent leur propre copie importée.
Un certificat intermédiaire ou à signature croisée de la chaîne servie a expiré
occasionnelleUn serveur qui regroupe un ancien certificat intermédiaire (par exemple un certificat à signature croisée copié depuis un fichier fullchain obsolète) peut amener les clients à construire un chemin passant par un certificat expiré, alors même que le certificat feuille est en cours de validité. L’expiration en 2021 de la signature croisée de l’AC racine DST Root CA X3 a cassé de nombreux clients anciens de cette manière.
L’horloge du client est fausse
occasionnelleLes appareils sans horloge sauvegardée par pile, les VM restaurées à partir d’instantanés et les conteneurs sur un hôte dont l’horloge dérive peuvent avoir des mois de décalage. Si tous les sites HTTPS échouent en même temps, vérifiez la date avant toute autre chose.
Un ancien client construit le chemin vers une racine qui a expiré
rareLes clients dont le fichier d’AC est obsolète ne connaissent parfois qu’une version expirée d’une racine et échouent alors que les clients modernes choisissent un chemin plus récent. Mettre à jour ca-certificates corrige ces clients.
Comment corriger l’erreur
- 1.
Trouver quel certificat a expiré
Affichez la date notAfter de chaque certificat envoyé par le serveur. Si le certificat feuille a expiré, renouvelez-le ; si c’est un certificat intermédiaire, remplacez le fichier de chaîne par celui que votre AC publie actuellement.
bash # Split the served chain into cert1.pem (leaf), cert2.pem, ... and print each expiry date openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | awk '/BEGIN CERT/{n++; f="cert" n ".pem"} /BEGIN CERT/,/END CERT/{print > f}' for f in cert*.pem; do openssl x509 -in "$f" -noout -subject -enddate; done - 2.
Renouveler, recharger et vérifier ce qui est réellement servi
Après le renouvellement, rechargez chaque processus et chaque équipement qui termine TLS pour ce nom, puis confirmez la date côté réseau plutôt qu’à partir du fichier sur le disque.
bash sudo certbot renew # or your ACME client / CA portal sudo systemctl reload nginx # the server keeps serving the old file until reloaded echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -enddate # confirm the new date is what the network sees - 3.
Corriger l’horloge du client
Lorsque le certificat est accepté sur d’autres machines, synchronisez l’heure de la machine en échec avec NTP. Dans les conteneurs, l’horloge vient de l’hôte : corrigez-la donc à cet endroit.
bash date -u # compare with the real UTC time timedatectl status # "System clock synchronized: yes"? sudo timedatectl set-ntp true - 4.
Mettre à jour le fichier d’AC du client
Sur les systèmes en service depuis longtemps, un paquet ca-certificates à jour supprime les racines mises hors service et ajoute les racines actuelles, ce qui permet à OpenSSL de choisir un chemin valide plutôt qu’un chemin expiré.
bash # Old clients: refresh the root store so they stop building paths through retired roots sudo apt-get update && sudo apt-get install --only-upgrade ca-certificates # Debian/Ubuntu sudo dnf upgrade ca-certificates # RHEL/Fedora
Erreurs associées
verify error:num=10:certificate has expiredOpenSSL CLI (openssl s_client / openssl verify)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509certificate has expiredNode.js tls / https / fetch[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has exp…Python ssl module (OpenSSL)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)