Mensaje de error
Password was not given but private key is encrypted
También existe el caso inverso, «Password was given but private key is not encrypted.»: la misma llamada con el desajuste contrario (ambos reproducidos con cryptography 50.0).
Python cryptography — TypeError from load_pem_private_key
Qué significa
Tu código llama a load_pem_private_key(data, password=None) con una clave privada cifrada: su PEM dice ENCRYPTED PRIVATE KEY o lleva encabezados Proc-Type: 4,ENCRYPTED. La biblioteca ve el envoltorio de cifrado y se niega a adivinar: necesita la frase de contraseña en bytes, o una clave que de verdad no esté cifrada.
Por qué ocurre
Clave generada con frase de contraseña, pero el código no espera ninguna
frecuenteopenssl genpkey/ec con -aes256, ssh-keygen con una frase de contraseña o un bundle emitido por una CA producen claves cifradas. El código de despliegue escrito para claves en texto plano pasa entonces password=None y se detiene aquí.
La contraseña está disponible, pero se pasa mal
frecuenteUna contraseña vacía cuenta como ninguna contraseña: el código que recurre a b"" cuando la variable de entorno no está definida recibe exactamente este mensaje. El parámetro debe ser bytes —un str falla con «Cannot convert … instance to a buffer»— y una contraseña leída de una variable de entorno puede llevar un salto de línea final que hace que el descifrado falle con «Incorrect password, could not decrypt key».
Se eligió el archivo de clave equivocado
ocasionalSe tomó una copia de seguridad cifrada (key.pem.enc, id_ecdsa con frase de contraseña) en lugar de la clave de despliegue que se dejó sin cifrar a propósito.
Cómo solucionarlo
- 1.
Pasar la frase de contraseña en bytes
Pasa la contraseña desde tu almacén de secretos, codificada en bytes; elimina los espacios en blanco por precaución.
python import os from cryptography.hazmat.primitives.serialization import load_pem_private_key password = os.environ["KEY_PASSPHRASE"].strip().encode() key = load_pem_private_key(pem_bytes, password=password) - 2.
O descifrar la clave una sola vez, durante el aprovisionamiento
Si el entorno de ejecución no puede gestionar una frase de contraseña, guarda la clave sin cifrar en un gestor de secretos adecuado: una clave cifrada cuya contraseña está en el mismo archivo env no añade ninguna protección. Y si la frase de contraseña llegó a viajar junto a la clave en un repositorio, rota la clave: en ese caso, el cifrado era pura decoración.
bash openssl pkey -in encrypted.pem -out plain.pem # (prompts once for the passphrase; protect plain.pem via the secret store)