Saltar al contenido
ecdsa.com
Python 3.13+ ssl modulecryptography de Python

Mensaje de error

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: CA cert does not include key usage extension

Aparece después de actualizar a Python 3.13 o posterior; las versiones anteriores no establecen el indicador estricto. Le sigue una ubicación en el código fuente, como «(_ssl.c:1082)». openssl verify -x509_strict informa de la misma comprobación como «error 92 at 1 depth lookup: CA cert does not include key usage extension».

Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_CA_CERT_MISSING_KEY_USAGE (92)

Qué significa

Desde Python 3.13, ssl.create_default_context() activa las comprobaciones X.509 estrictas de OpenSSL (VERIFY_X509_STRICT). Una de ellas exige que todo certificado de CA lleve una extensión keyUsage que permita firmar certificados, como establece el RFC 5280. Tu certificado de CA no tiene keyUsage, así que una cadena que funcionaba en Python 3.12 ahora se rechaza aunque se confíe explícitamente en la CA.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Confirmar qué extensión falta

    Imprime basicConstraints y keyUsage de la CA, y ejecuta openssl verify -x509_strict para ver de una vez todos los fallos del modo estricto.

    bash
    openssl x509 -in ca.pem -noout -ext basicConstraints,keyUsage
    # Same strict checks as Python 3.13+, without Python:
    openssl verify -x509_strict -CAfile ca.pem server.pem
  2. 2.

    Volver a emitir el certificado de la CA con keyUsage

    Vuelve a firmar la CA con keyUsage = critical, keyCertSign, cRLSign (y basicConstraints crítica). Si mantienes la misma clave y el mismo sujeto, los certificados que ya emitió la CA siguen encadenando con el nuevo certificado de la CA; distribuye el nuevo archivo de la CA a los clientes.

    bash
    # A CA certificate with the extensions RFC 5280 requires
    openssl req -x509 -new -key ca.key -days 3650 -subj "/CN=Example Private CA" \
      -addext "basicConstraints=critical,CA:TRUE" \
      -addext "keyUsage=critical,keyCertSign,cRLSign" \
      -out ca.pem
    # Reusing the old key and subject keeps already issued certificates verifiable.
  3. 3.

    Solución provisional: quitar VERIFY_X509_STRICT en este contexto

    Quitar el indicador restablece el comportamiento de Python 3.12 en un solo contexto. No equivale a desactivar la verificación, pero sí acepta certificados que incumplen el RFC 5280; retira este ajuste en cuanto la CA esté corregida.

    python
    # Temporary workaround while the CA is reissued: the chain, dates and host name
    # are still verified, only the RFC 5280 profile checks are relaxed.
    import ssl
    ctx = ssl.create_default_context(cafile="ca.pem")
    ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

Errores relacionados

Explorar toda la base de datos de errores de firma