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
Caducó el certificado del servidor (o un intermedio)
frecuenteLa renovación no se ejecutó, o se ejecutó pero el servicio no se recargó. Comprueba las fechas del certificado que realmente se sirve antes de cambiar nada en el cliente.
Un certifi o un bundle del sistema desactualizado
ocasionalLos entornos fijados a una versión antigua de certifi (o con imágenes de sistema operativo antiguas) pueden conocer solo versiones caducadas de las raíces y construir una ruta caducada, mientras que los clientes actuales funcionan. Esto es lo que rompió muchos clientes de Python cuando caducó en 2021 la firma cruzada de la CA raíz DST Root CA X3.
El reloj del cliente está mal
ocasionalUna VM o un host de contenedores con el reloj en el futuro hace que los certificados válidos parezcan caducados. Si fallan todos los sitios a la vez, comprueba primero la hora.
Cómo solucionarlo
- 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.
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.
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
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)