Pular para o conteúdo
ecdsa.com
Python ssl module (OpenSSL)Python (cryptography)

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

Como corrigir

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

Ver toda a base de erros de assinatura