Mensagem de erro
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
O texto é idêntico no Python com OpenSSL 1.1.1, 3.0 e 3.5, seguido de uma localização no código-fonte, como “(_ssl.c:1082)”. Um certificado cuja validade ainda não começou gera “certificate is not yet valid”.
Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_CERT_HAS_EXPIRED (10)
O que significa
O OpenSSL encontrou na cadeia um certificado cuja validade terminou antes da hora atual desta máquina. Normalmente, o certificado do servidor não foi renovado ou o renovado não está sendo servido; às vezes, o cliente monta o caminho por uma raiz expirada de um bundle de CAs desatualizado, ou o relógio dele está errado.
Por que acontece
O certificado do servidor (ou o intermediário) expirou
comumA renovação não rodou, ou rodou, mas o serviço não foi recarregado. Confira as datas do certificado que está de fato sendo servido antes de mudar qualquer coisa no cliente.
Um certifi ou bundle do sistema desatualizado
ocasionalAmbientes fixados em uma versão antiga do certifi (ou em imagens antigas do sistema operacional) podem conhecer apenas versões expiradas dos certificados raiz e montar um caminho expirado, enquanto clientes atualizados funcionam. Foi isso que quebrou muitos clientes Python quando a assinatura cruzada da DST Root CA X3 expirou em 2021.
O relógio do cliente está errado
ocasionalUma VM ou um host de contêineres com o relógio no futuro faz certificados válidos parecerem expirados. Se todos os sites falharem ao mesmo tempo, confira o horário primeiro.
Como corrigir
- 1.
Examinar o certificado servido
Busque o certificado uma vez com a verificação desativada, só para lê-lo, e confira o notAfter (cole-o no decodificador). Não use essa conexão não verificada para mais nada.
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.
Atualizar o certifi ou o bundle do sistema operacional
Se o próprio certificado do servidor estiver em ordem, atualize as raízes do cliente: pip install --upgrade certifi para bibliotecas que usam o certifi e o pacote ca-certificates para o bundle do sistema.
bash python3 -m pip install --upgrade certifi python3 -c "import certifi; print(certifi.__version__, certifi.where())" - 3.
Corrigir o relógio do sistema
Ative o NTP no cliente (no host, no caso de contêineres).
bash date -u sudo timedatectl set-ntp true
Erros 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)