Aller au contenu
ecdsa.com
Python ssl module (OpenSSL)cryptography (Python)

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

Comment corriger l’erreur

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

Parcourir toute la base de données des erreurs de signature