Saltar al contenido
ecdsa.com
Python ssl module (OpenSSL)cryptography de Python

Mensaje de error

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired

El texto es idéntico en Python con OpenSSL 1.1.1, 3.0 y 3.5, seguido de una ubicación en el código fuente, como «(_ssl.c:1082)». Un certificado cuya validez aún no ha empezado da «certificate is not yet valid».

Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_CERT_HAS_EXPIRED (10)

Qué significa

OpenSSL encontró en la cadena un certificado cuya validez terminó antes de la hora actual de este equipo. Normalmente, el certificado del servidor no se renovó o el renovado no se está sirviendo; a veces, el cliente construye la ruta a través de una raíz caducada de un bundle de CA desactualizado, o su reloj está mal.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Mirar el certificado que se sirve

    Obtén el certificado una vez con la verificación desactivada, solo para leerlo, y comprueba notAfter (pégalo en el decodificador). No uses esa conexión sin verificar para nada más.

    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.

    Actualizar certifi o el bundle del sistema operativo

    Si el certificado del propio servidor está bien, actualiza las raíces del cliente: pip install --upgrade certifi para las bibliotecas que usan certifi y el paquete ca-certificates para el bundle del sistema.

    bash
    python3 -m pip install --upgrade certifi
    python3 -c "import certifi; print(certifi.__version__, certifi.where())"
  3. 3.

    Corregir el reloj del sistema

    Activa NTP en el cliente (en el host, en el caso de los contenedores).

    bash
    date -u
    sudo timedatectl set-ntp true

Errores relacionados

Explorar toda la base de datos de errores de firma