Message d’erreur
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).
Également affiché sous la forme
- 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)>
Vérifié sur plusieurs versions : cryptography 45.0 et les versions ultérieures ajoutent « Details: … » (par exemple « ASN.1 parsing error: short data »). Les versions 43 et 44 lèvent le texte sous forme de tuple avec des objets d’erreur OpenSSL et ajoutent « the provided password may be incorrect » à la phrase (et emploient aussi ce message pour les mots de passe erronés) ; les versions 36 à 42 lèvent la forme tuple sans cette mention.
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / load_der_public_key
Ce que cela signifie
La bibliothèque cryptography a trouvé des données de clé qu’elle n’a pas pu transformer en objet clé. Pour une entrée PEM, les lignes d’encadrement étaient correctes (sinon vous verriez « Unable to load PEM file ») : le problème vient donc du DER qu’elles encadrent. Il est tronqué, sa structure n’est pas celle qu’attend le chargeur, ou il décrit une clé que cryptography refuse de charger – des clés EC avec des paramètres de courbe explicites, ou des clés chiffrées avec un algorithme qu’elle ne prend pas en charge. Les versions récentes ajoutent « Details: … » avec la raison ASN.1 de bas niveau.
Pourquoi cela se produit
Le corps base64 est incomplet ou altéré
fréquenteUne ligne perdue en copiant une clé depuis un terminal ou un gestionnaire de secrets, une clé tronquée par un champ de taille limitée, ou des caractères modifiés par un éditeur. Les lignes d’en-tête et de fin restent intactes : l’analyse PEM réussit donc, et l’analyse DER échoue.
Le chargeur ne correspond pas à la structure de la clé
fréquenteUne clé publique passée à `load_der_private_key`, un certificat passé à un chargeur de clés, ou une clé au format OpenSSH (`-----BEGIN OPENSSH PRIVATE KEY-----`) passée à `load_pem_private_key` au lieu de `load_ssh_private_key`.
Clé EC avec des paramètres de courbe explicites
occasionnelleLes clés produites par certains outils anciens ou exportées depuis des HSM détaillent le nombre premier, les coefficients et le générateur de la courbe au lieu de désigner la courbe par son OID. cryptography les rejette délibérément (la RFC 5480 impose des courbes nommées pour PKIX).
Clé chiffrée avec un algorithme que cryptography ne prend pas en charge
occasionnelleLes fichiers PKCS#8 chiffrés avec d’anciens schémas PBE (par exemple PBE-SHA1-RC2 ou des variantes de DES) ne peuvent pas être déchiffrés par les builds actuels. Chiffrez-les de nouveau avec AES (`openssl pkcs8 -topk8 -v2 aes-256-cbc`).
Comment corriger l’erreur
- 1.
Vérifier d’abord la clé avec OpenSSL
Si `openssl asn1parse` échoue déjà, le fichier est endommagé : procurez-vous une nouvelle copie. Si OpenSSL le charge mais pas cryptography, examinez l’encodage de la courbe ou l’algorithme de chiffrement.
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.
Utiliser le chargeur adapté à la clé
Choisissez entre les chargeurs PEM, DER et OpenSSH d’après les données elles-mêmes, et utilisez les chargeurs de clés publiques pour les clés publiques.
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.
Convertir les paramètres explicites en courbe nommée
OpenSSL 3 écrit par défaut les clés EC avec des courbes nommées : réexporter la clé une seule fois corrige donc les clés à paramètres explicites pour toutes les bibliothèques.
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
Erreurs associées
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)