Fehlermeldung
Password was given but private key is not encrypted.
Auch ausgegeben als
- TypeError: Password was given but private key is not encrypted.
Python cryptography — TypeError from load_pem_private_key / load_der_private_key
Was der Fehler bedeutet
Du hast einem Schlüssel-Loader ein `password` übergeben, aber der Schlüssel ist unverschlüsselt gespeichert. cryptography behandelt das als Programmierfehler (`TypeError`), statt das Passwort zu ignorieren, denn stillschweigendes Akzeptieren würde einen Konfigurationsdrift verbergen – etwa einen Schlüssel, den jemand entschlüsselt und im Klartext gespeichert hat. Der Fehler ist das Gegenstück zu „Password was not given but private key is encrypted“.
Warum der Fehler auftritt
Eine Passphrase-Einstellung hat einen verschlüsselten Schlüssel überlebt
häufigDer Schlüssel wurde ohne Verschlüsselung neu exportiert oder neu erzeugt, aber das Deployment stellt weiterhin die alte Passphrase-Variable bereit. Rotationen durch verschiedene Teams hinterlassen diese Unstimmigkeit häufig.
Ein leerer String statt None
häufig`password=b""` ist ein Passwort. Code, der eine nicht gesetzte Umgebungsvariable als `""` liest und kodiert, übergibt für einen unverschlüsselten Schlüssel ein leeres Passwort und bekommt diesen Fehler.
Die Konvertierung hat die Verschlüsselung entfernt
gelegentlich`openssl pkey -in enc.pem -out key.pem` (ohne Cipher-Option) oder `ssh-keygen -p` mit leerer neuer Passphrase schreibt den Schlüssel unverschlüsselt, während die Anwendung weiterhin erwartet, ihn zu entschlüsseln.
So behebst du den Fehler
- 1.
Für unverschlüsselte Schlüssel None übergeben
Normalisiere leere Konfigurationswerte zu `None`. Schreibt eine Richtlinie vor, dass Schlüssel verschlüsselt gespeichert sein müssen, werte diesen Fehler als Zeichen, dass ein unverschlüsselter Schlüssel ausgerollt wurde, und ersetze stattdessen den Schlüssel.
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.
Verschlüsselung am PEM selbst erkennen
Verschlüsselte PKCS#8-Schlüssel verwenden das Label `ENCRYPTED PRIVATE KEY`; Schlüssel im alten PEM-Format von OpenSSL tragen einen Header `Proc-Type: 4,ENCRYPTED`. Entscheide anhand dessen, ob du nach einer Passphrase fragst.
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