Fehlermeldung
Password was not given but private key is encrypted
Den spiegelbildlichen Fall gibt es auch: „Password was given but private key is not encrypted.“ – derselbe Aufruf, umgekehrte Unstimmigkeit (beides reproduziert mit cryptography 50.0).
Python cryptography — TypeError from load_pem_private_key
Was der Fehler bedeutet
Du hast load_pem_private_key(data, password=None) für einen verschlüsselten Schlüssel aufgerufen – in seinem PEM steht ENCRYPTED PRIVATE KEY, oder es enthält die Header Proc-Type: 4,ENCRYPTED. Die Bibliothek erkennt die Verschlüsselungshülle und weigert sich zu raten: Nötig ist die Passphrase als bytes-Objekt oder ein Schlüssel, der tatsächlich unverschlüsselt ist.
Warum der Fehler auftritt
Schlüssel mit Passphrase erzeugt, Code erwartet keine
häufigopenssl genpkey/ec mit -aes256, ssh-keygen mit Passphrase oder ein von einer CA ausgestelltes Bundle erzeugen verschlüsselte Schlüssel. Deployment-Code, der für Schlüssel im Klartext geschrieben wurde, übergibt dann password=None und bleibt hier stehen.
Passwort vorhanden, aber falsch übergeben
häufigEin leeres Passwort zählt als kein Passwort: Code, der auf b"" zurückfällt, wenn die Umgebungsvariable nicht gesetzt ist, bekommt genau diese Meldung. Der Parameter muss vom Typ bytes sein – ein str scheitert mit „Cannot convert … instance to a buffer“ – und ein aus einer Umgebungsvariable gelesenes Passwort kann einen Zeilenumbruch am Ende enthalten, an dem die Entschlüsselung mit „Incorrect password, could not decrypt key“ scheitert.
Falsche Schlüsseldatei ausgewählt
gelegentlichEine verschlüsselte Sicherungskopie (key.pem.enc, id_ecdsa mit Passphrase), die statt des absichtlich unverschlüsselt belassenen Deployment-Schlüssels geladen wurde.
So behebst du den Fehler
- 1.
Passphrase als bytes-Objekt übergeben
Übergib das Passwort über deinen Secret Store, als bytes kodiert; entferne vorsorglich führenden und abschließenden Whitespace.
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.
Oder den Schlüssel einmalig bei der Bereitstellung entschlüsseln
Kann die Laufzeitumgebung keine Passphrase verwalten, speichere den Schlüssel unverschlüsselt in einem richtigen Secret Manager – ein verschlüsselter Schlüssel, dessen Passwort in derselben env-Datei liegt, bringt keinen Schutz. Und wenn die Passphrase jemals neben dem Schlüssel in einem Repository lag, rotiere den Schlüssel: Ab diesem Moment war die Verschlüsselung nur Dekoration.
bash openssl pkey -in encrypted.pem -out plain.pem # (prompts once for the passphrase; protect plain.pem via the secret store)