Message d’erreur
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
Libellé identique dans Python avec OpenSSL 1.1.1, 3.0 et 3.5, suivi d’un emplacement dans le code source, comme « (_ssl.c:1082) ». Un certificat dont la validité n’a pas encore commencé donne « certificate is not yet valid ».
Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_CERT_HAS_EXPIRED (10)
Ce que cela signifie
OpenSSL a trouvé dans la chaîne un certificat dont la validité a pris fin avant l’heure actuelle de cette machine. En général, le certificat du serveur n’a pas été renouvelé, ou le certificat renouvelé n’est pas celui qui est servi ; parfois, le client construit le chemin via une racine expirée issue d’un fichier d’AC obsolète, ou son horloge est fausse.
Pourquoi cela se produit
Le certificat du serveur (ou un certificat intermédiaire) a expiré
fréquenteLe renouvellement ne s’est pas exécuté, ou s’est exécuté sans que le service soit rechargé. Vérifiez les dates du certificat réellement servi avant de modifier quoi que ce soit côté client.
Un certifi ou un fichier d’AC système obsolète
occasionnelleLes environnements figés sur une ancienne version de certifi (ou sur d’anciennes images de système d’exploitation) ne connaissent parfois que des versions expirées des racines et construisent un chemin expiré, alors que les clients à jour réussissent. C’est ce qui a cassé de nombreux clients Python lorsque la signature croisée de l’AC racine DST Root CA X3 a expiré en 2021.
L’horloge du client est fausse
occasionnelleUne VM ou un hôte de conteneurs dont l’horloge est dans le futur fait paraître expirés des certificats valides. Si tous les sites échouent en même temps, vérifiez d’abord l’heure.
Comment corriger l’erreur
- 1.
Examiner le certificat servi
Récupérez le certificat une seule fois avec la vérification désactivée, uniquement pour le lire, et contrôlez notAfter (collez-le dans le décodeur). N’utilisez cette connexion non vérifiée pour rien d’autre.
python import socket, ssl # Read the served certificate without verifying it, to see its dates ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE with socket.create_connection(("api.example.com", 443)) as raw: with ctx.wrap_socket(raw, server_hostname="api.example.com") as tls: der = tls.getpeercert(binary_form=True) print(ssl.DER_cert_to_PEM_cert(der)) # paste into a certificate decoder - 2.
Mettre à jour certifi ou le fichier d’AC du système
Si le certificat du serveur lui-même est correct, actualisez les racines du client : pip install --upgrade certifi pour les bibliothèques qui utilisent certifi, le paquet ca-certificates pour le fichier d’AC système.
bash python3 -m pip install --upgrade certifi python3 -c "import certifi; print(certifi.__version__, certifi.where())" - 3.
Corriger l’horloge système
Activez NTP sur le client (sur l’hôte, pour les conteneurs).
bash date -u sudo timedatectl set-ntp true
Erreurs associées
curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509certificate has expiredNode.js tls / https / fetchverify error:num=10:certificate has expiredOpenSSL CLI (openssl s_client / openssl verify)