Mensaje de error
Incorrect password, could not decrypt key
También se muestra como
- ValueError: Incorrect password, could not decrypt key
- Bad decrypt. Incorrect password?
Texto según la versión (comprobado en cada una): 45.0 y posteriores, «Incorrect password, could not decrypt key»; 43 y 44 notifican una contraseña incorrecta como «Could not deserialize key data… the provided password may be incorrect…»; 42 y anteriores, «Bad decrypt. Incorrect password?».
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / pkcs12.load_key_and_certificates
Qué significa
La clave está cifrada y cryptography intentó descifrarla con la contraseña proporcionada, pero el descifrado falló. Las claves privadas cifradas no llevan ninguna «pista de contraseña» —la única señal es que los bytes descifrados no forman una clave válida—, así que este error siempre significa que los bytes que pasas no son la frase de contraseña que se usó al cifrarla.
Por qué ocurre
Un salto de línea final forma parte de la contraseña
frecuenteLas frases de contraseña guardadas con `echo secret > file`, en secretos de Kubernetes creados a partir de archivos o en archivos `.env` suelen terminar en `\n`. Leer el archivo tal cual pasa un byte de más.
La frase de contraseña pertenece a otra clave
frecuenteVarias claves y varias frases de contraseña en un mismo almacén de secretos, o una clave que se volvió a cifrar durante una rotación mientras la aplicación conservaba la frase de contraseña anterior.
Frase de contraseña no ASCII codificada de otra forma
ocasionalEs posible que la herramienta que cifró la clave usara Latin-1 o UTF-16 para una frase de contraseña con caracteres no ASCII, mientras que tu código la codifica en UTF-8. Los caracteres coinciden; los bytes, no.
Archivos PKCS#12 de herramientas antiguas
ocasionalAlgunas exportaciones `.p12` heredadas tratan la contraseña vacía de otra manera (sin contraseña frente a cadena vacía). Prueba `None` y `b""` de forma deliberada en lugar de adivinar otros valores.
Cómo solucionarlo
- 1.
Leer la frase de contraseña con sus bytes exactos
Elimina solo los finales de línea, nunca otros espacios en blanco, y conserva la frase de contraseña como bytes desde el origen hasta el cargador.
python from pathlib import Path passphrase = Path("/run/secrets/key_passphrase").read_bytes().rstrip(b"\r\n") key = serialization.load_pem_private_key(pem, password=passphrase) - 2.
Confirmar la frase de contraseña fuera de tu código
Si OpenSSL acepta la frase de contraseña escrita a mano pero tu código falla, la diferencia está en cómo la lee el código (salto de línea, codificación). Si OpenSSL también falla, la frase de contraseña simplemente es incorrecta.
bash # Prompts for the passphrase; "bad decrypt" means the passphrase is wrong, not the file openssl pkey -in encrypted.pem -noout && echo "passphrase OK" printf '%s' "$KEY_PASSPHRASE" | wc -c # length without a trailing newline