Message d’erreur
Password was given but private key is not encrypted.
Également affiché sous la forme
- TypeError: Password was given but private key is not encrypted.
Python cryptography — TypeError from load_pem_private_key / load_der_private_key
Ce que cela signifie
Vous avez passé un `password` à un chargeur de clés, mais la clé est stockée sans chiffrement. Plutôt que d’ignorer le mot de passe, cryptography traite ce cas comme une erreur de programmation (`TypeError`), car l’accepter en silence masquerait une dérive de configuration – par exemple une clé que quelqu’un a déchiffrée puis enregistrée en clair. C’est le cas symétrique de « Password was not given but private key is encrypted ».
Pourquoi cela se produit
Un paramètre de phrase de passe a survécu à une clé chiffrée
fréquenteLa clé a été réexportée ou régénérée sans chiffrement, mais le déploiement fournit toujours l’ancienne variable de phrase de passe. Les rotations menées par des équipes différentes laissent souvent ce décalage derrière elles.
Une chaîne vide au lieu de None
fréquente`password=b""` est un mot de passe. Un code qui lit une variable d’environnement non définie comme `""` puis l’encode passe un mot de passe vide pour une clé non chiffrée et obtient cette erreur.
La conversion a supprimé le chiffrement
occasionnelle`openssl pkey -in enc.pem -out key.pem` (sans option de chiffrement) ou `ssh-keygen -p` avec une nouvelle phrase de passe vide écrit la clé sans chiffrement, alors que l’application s’attend toujours à la déchiffrer.
Comment corriger l’erreur
- 1.
Passer None pour les clés non chiffrées
Normalisez les valeurs de configuration vides en `None`. Si votre politique impose que les clés soient chiffrées au repos, considérez plutôt cette erreur comme le signe qu’une clé non chiffrée a été déployée, et remplacez la clé.
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.
Détecter le chiffrement à partir du PEM lui-même
Les clés PKCS#8 chiffrées utilisent l’étiquette `ENCRYPTED PRIVATE KEY` ; les anciennes clés PEM d’OpenSSL portent un en-tête `Proc-Type: 4,ENCRYPTED`. Servez-vous-en pour décider s’il faut demander une phrase de passe.
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