Saltar al contenido
ecdsa.com
Python cryptographycryptography de Python

Mensaje de error

Password was given but private key is not encrypted.

También se muestra como

  • TypeError: Password was given but private key is not encrypted.

Python cryptography — TypeError from load_pem_private_key / load_der_private_key

Qué significa

Tu código pasa un `password` a un cargador de claves, pero la clave está guardada sin cifrar. cryptography lo trata como un error de programación (`TypeError`) en lugar de ignorar la contraseña, porque aceptarla en silencio ocultaría una desviación de la configuración, por ejemplo, una clave que alguien descifró y guardó en texto en claro. Es la imagen especular de «Password was not given but private key is encrypted».

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Pasar None para las claves sin cifrar

    Normaliza los valores de configuración vacíos a `None`. Si una política exige que las claves estén cifradas en reposo, trata este error como señal de que se desplegó una clave sin cifrar y, en su lugar, sustituye la clave.

    python
    import os
    from cryptography.hazmat.primitives import serialization
    
    passphrase = os.environ.get("KEY_PASSPHRASE") or None   # "" becomes None
    key = serialization.load_pem_private_key(pem, password=passphrase.encode() if passphrase else None)
  2. 2.

    Detectar el cifrado a partir del propio PEM

    Las claves PKCS#8 cifradas usan la etiqueta `ENCRYPTED PRIVATE KEY`; las claves PEM heredadas de OpenSSL llevan el encabezado `Proc-Type: 4,ENCRYPTED`. Básate en ello para decidir si hay que pedir una frase de contraseña.

    python
    def is_encrypted_pem(pem: bytes) -> bool:
        head = pem.lstrip()[:64]
        return head.startswith(b"-----BEGIN ENCRYPTED PRIVATE KEY-----") or b"Proc-Type: 4,ENCRYPTED" in pem

Errores relacionados

Explorar toda la base de datos de errores de firma