Message d’erreur
Password was not given but private key is encrypted
Le cas symétrique existe aussi : « Password was given but private key is not encrypted. » – même appel, discordance inverse (les deux cas ont été reproduits avec cryptography 50.0).
Python cryptography — TypeError from load_pem_private_key
Ce que cela signifie
Vous avez appelé load_pem_private_key(data, password=None) sur une clé chiffrée : son PEM indique ENCRYPTED PRIVATE KEY, ou porte des en-têtes Proc-Type: 4,ENCRYPTED. La bibliothèque voit l’enveloppe de chiffrement et refuse de deviner : il lui faut la phrase de passe sous forme d’objet bytes, ou une clé réellement non chiffrée.
Pourquoi cela se produit
Clé générée avec une phrase de passe, alors que le code n’en attend pas
fréquenteopenssl genpkey/ec avec -aes256, ssh-keygen avec une phrase de passe, ou un bundle émis par une AC produisent des clés chiffrées. Le code de déploiement écrit pour des clés en clair passe alors password=None et s’arrête ici.
Mot de passe disponible, mais mal transmis
fréquenteUn mot de passe vide équivaut à une absence de mot de passe : le code qui se rabat sur b"" lorsque la variable d’environnement n’est pas définie obtient exactement ce message. Le paramètre doit être de type bytes (un str provoque l’erreur « Cannot convert … instance to a buffer »), et un mot de passe lu depuis une variable d’environnement peut contenir un saut de ligne final qui fait échouer le déchiffrement avec « Incorrect password, could not decrypt key ».
Mauvais fichier de clé sélectionné
occasionnelleUne copie de sauvegarde chiffrée (key.pem.enc, id_ecdsa avec phrase de passe) chargée à la place de la clé de déploiement, laissée volontairement non chiffrée.
Comment corriger l’erreur
- 1.
Fournir la phrase de passe sous forme de bytes
Transmettez le mot de passe depuis votre gestionnaire de secrets, encodé en bytes ; par précaution, retirez les caractères d’espacement en début et en fin.
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.
Ou déchiffrer la clé une seule fois, au moment du provisionnement
Si l’environnement d’exécution ne peut pas gérer de phrase de passe, stockez la clé non chiffrée dans un véritable gestionnaire de secrets : une clé chiffrée dont le mot de passe se trouve dans le même fichier d’environnement n’apporte aucune protection. Et si la phrase de passe a un jour voyagé à côté de la clé dans un dépôt, effectuez une rotation de la clé : dès lors, le chiffrement n’était qu’une façade.
bash openssl pkey -in encrypted.pem -out plain.pem # (prompts once for the passphrase; protect plain.pem via the secret store)