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
La configuración de la frase de contraseña sobrevivió a la clave cifrada
frecuenteLa clave se volvió a exportar o se regeneró sin cifrado, pero el despliegue sigue proporcionando la variable con la frase de contraseña anterior. Las rotaciones que hacen equipos distintos suelen dejar tras de sí este desajuste.
Una cadena vacía en lugar de None
frecuente`password=b""` es una contraseña. El código que lee una variable de entorno no definida como `""` y la codifica pasa una contraseña vacía para una clave sin cifrar y recibe este error.
La conversión eliminó el cifrado
ocasional`openssl pkey -in enc.pem -out key.pem` (sin una opción de cifrado) o `ssh-keygen -p` con una nueva frase de contraseña vacía escriben la clave sin cifrar, mientras que la aplicación sigue esperando descifrarla.
Cómo solucionarlo
- 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.
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