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
Una CA creada con un simple openssl req -x509
frecuenteLa configuración predeterminada de OpenSSL añade basicConstraints, pero no keyUsage, a los certificados autofirmados. Innumerables guías crean CA privadas exactamente así, y lo mismo hacen algunos fixtures de pruebas y herramientas de desarrollo.
El cliente pasó a Python 3.13 o posterior
frecuenteEl certificado no cambió; el verificador se volvió más estricto. Las imágenes base de contenedores y los runners de CI que pasan a python:3.13+ hacen aflorar el problema sin ningún cambio en la PKI.
PKI internas antiguas o CA de dispositivos dedicados
ocasionalAlgunos certificados de CA generados por dispositivos dedicados y algunos certificados de CA empresariales antiguos omiten keyUsage. Siguen funcionando en los clientes que no aplican comprobaciones estrictas.
Cómo solucionarlo
- 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.
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.
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
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints o…Python 3.13+ ssl module[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority K…Python 3.13+ ssl module[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local…Python ssl module (OpenSSL)