Fehlermeldung
Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).
Auch ausgegeben als
- ValueError: Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters). Details: ASN.1 parsing error: short data (needed at least 48 additional bytes)
- Could not deserialize key data. The data may be in an incorrect format, the provided password may be incorrect, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).
- ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [<OpenSSLError(code=503841036, lib=60, reason=524556, reason_text=unsupported)>
Über mehrere Releases geprüft: Ab cryptography 45.0 wird „Details: …“ angehängt (zum Beispiel „ASN.1 parsing error: short data“). Die Versionen 43–44 liefern den Text als Tupel mit OpenSSL-Fehlerobjekten und ergänzen den Satz um „the provided password may be incorrect“ (und verwenden diese Meldung auch bei falschen Passwörtern); 36–42 liefern die Tupelform ohne diesen Zusatz.
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / load_der_public_key
Was der Fehler bedeutet
cryptography hat Schlüsseldaten gefunden, aus denen es kein Schlüsselobjekt erzeugen konnte. Bei PEM-Eingaben waren die BEGIN- und END-Zeilen in Ordnung (sonst würdest du „Unable to load PEM file“ sehen), das Problem liegt also im darin enthaltenen DER: Es ist abgeschnitten, hat eine andere Struktur, als der Loader erwartet, oder beschreibt einen Schlüssel, den cryptography nicht laden will – EC-Schlüssel mit expliziten Kurvenparametern oder Schlüssel, die mit einem Algorithmus verschlüsselt sind, den es nicht unterstützt. Neuere Versionen hängen „Details: …“ mit dem Low-Level-Grund aus dem ASN.1-Parser an.
Warum der Fehler auftritt
Der base64-Inhalt ist unvollständig oder verändert
häufigEine Zeile, die beim Kopieren eines Schlüssels aus einem Terminal oder einem Secret Manager verloren ging, ein Schlüssel, den ein Feld mit Größenlimit abgeschnitten hat, oder Zeichen, die ein Editor verändert hat. Header und Footer bleiben erhalten, deshalb gelingt das PEM-Parsing, während das DER-Parsing scheitert.
Der Loader passt nicht zur Struktur des Schlüssels
häufigEin öffentlicher Schlüssel, der an `load_der_private_key` übergeben wurde, ein Zertifikat, das an einen Schlüssel-Loader ging, oder ein Schlüssel im OpenSSH-Format (`-----BEGIN OPENSSH PRIVATE KEY-----`), der an `load_pem_private_key` statt an `load_ssh_private_key` übergeben wurde.
EC-Schlüssel mit expliziten Kurvenparametern
gelegentlichSchlüssel aus manchen älteren Tools oder aus HSM-Exporten schreiben Primzahl, Koeffizienten und Generator der Kurve aus, statt die Kurve per OID zu benennen. cryptography lehnt solche Schlüssel absichtlich ab (RFC 5480 verlangt für PKIX benannte Kurven).
Mit einem Algorithmus verschlüsselt, den cryptography nicht unterstützt
gelegentlichPKCS#8-Dateien, die mit veralteten PBE-Verfahren verschlüsselt sind (zum Beispiel PBE-SHA1-RC2 oder DES-Varianten), lassen sich mit aktuellen Builds nicht entschlüsseln. Verschlüssle sie neu mit AES (`openssl pkcs8 -topk8 -v2 aes-256-cbc`).
So behebst du den Fehler
- 1.
Schlüssel zuerst mit OpenSSL prüfen
Scheitert schon `openssl asn1parse`, ist die Datei beschädigt – besorge dir eine neue Kopie. Lädt OpenSSL sie, cryptography aber nicht, sieh dir die Kodierung der Kurve oder den Verschlüsselungsalgorithmus an.
bash openssl asn1parse -in key.pem | head -20 # does the DER parse at all? openssl pkey -in key.pem -noout -text | head # private key: type, curve, size openssl pkey -pubin -in pub.pem -noout -text # public key - 2.
Passenden Loader für den Schlüssel verwenden
Wähle anhand der Daten selbst zwischen den Loadern für PEM, DER und OpenSSH, und verwende für öffentliche Schlüssel die Public-Key-Loader.
python from cryptography.hazmat.primitives import serialization def load_any_private_key(data: bytes, password: bytes | None = None): if data.lstrip().startswith(b"-----BEGIN OPENSSH PRIVATE KEY-----"): return serialization.load_ssh_private_key(data, password) if data.lstrip().startswith(b"-----BEGIN"): return serialization.load_pem_private_key(data, password) return serialization.load_der_private_key(data, password) - 3.
Explizite Parameter in eine benannte Kurve umwandeln
OpenSSL 3 schreibt EC-Schlüssel standardmäßig mit benannten Kurven, daher behebt ein einmaliger Neuexport des Schlüssels das Problem mit expliziten Parametern für jede Bibliothek.
bash # Re-encode an EC key with a named curve instead of explicit parameters openssl pkey -in explicit.pem -out named.pem openssl ec -in named.pem -param_out -noout -text | grep "ASN1 OID" # e.g. prime256v1
Verwandte Fehler
Unable to load PEM file. See https://cryptography.io/en/latest/faq/#why-can-t-i…Python cryptographyValid PEM but no BEGIN PUBLIC KEY/END PUBLIC KEY delimiters. Are you sure this…Python cryptographyPassword was given but private key is not encrypted.Python cryptographyerror:0680009B:asn1 encoding routines:ASN1_get_object:too longOpenSSL 3.x CLI (asn1parse, d2i loaders)