Mensaje de error
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).
También se muestra como
- 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)>
Comprobado en varias versiones: cryptography 45.0 y posteriores añaden «Details: …» (por ejemplo, «ASN.1 parsing error: short data»). Las versiones 43 y 44 lanzan el texto como una tupla con objetos de error de OpenSSL y añaden a la frase «the provided password may be incorrect» (y también emiten este mensaje cuando la contraseña es incorrecta); de la 36 a la 42 lanzan la forma de tupla sin esa frase.
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / load_der_public_key
Qué significa
cryptography encontró datos de clave que no pudo convertir en un objeto de clave. En una entrada PEM, las líneas de la armadura estaban bien (si no, verías «Unable to load PEM file»), así que el problema está en el DER que hay dentro: está truncado, tiene una estructura distinta de la que espera el cargador o describe una clave que cryptography se niega a cargar, como las claves EC con parámetros de curva explícitos o las claves cifradas con un algoritmo que no admite. Las versiones recientes añaden «Details: …» con el motivo de bajo nivel de ASN.1.
Por qué ocurre
El cuerpo base64 está incompleto o alterado
frecuenteUna línea perdida al copiar una clave desde una terminal o un gestor de secretos, una clave truncada por un campo con límite de tamaño o caracteres modificados por un editor. El encabezado y el pie se conservan, así que el análisis PEM funciona y el análisis DER falla.
El cargador no corresponde a la estructura de la clave
frecuenteUna clave pública pasada a `load_der_private_key`, un certificado pasado a un cargador de claves o una clave en formato OpenSSH (`-----BEGIN OPENSSH PRIVATE KEY-----`) pasada a `load_pem_private_key` en lugar de a `load_ssh_private_key`.
Clave EC con parámetros de curva explícitos
ocasionalLas claves que producen algunas herramientas antiguas o las exportaciones desde un HSM detallan el primo, los coeficientes y el generador de la curva en lugar de nombrar la curva por su OID. cryptography las rechaza a propósito (el RFC 5480 exige curvas con nombre en PKIX).
Clave cifrada con un algoritmo que cryptography no admite
ocasionalLas compilaciones actuales no pueden descifrar los archivos PKCS#8 cifrados con esquemas PBE heredados (por ejemplo, PBE-SHA1-RC2 o variantes de DES). Vuelve a cifrarlos con AES (`openssl pkcs8 -topk8 -v2 aes-256-cbc`).
Cómo solucionarlo
- 1.
Comprobar primero la clave con OpenSSL
Si ya falla `openssl asn1parse`, el archivo está dañado: consigue una copia nueva. Si OpenSSL lo carga y cryptography no, revisa la codificación de la curva o el algoritmo de cifrado.
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.
Usar el cargador que corresponde a la clave
Elige entre los cargadores PEM, DER y OpenSSH a partir de los propios datos, y usa los cargadores de claves públicas para las claves públicas.
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 los parámetros explícitos en una curva con nombre
OpenSSL 3 escribe de forma predeterminada las claves EC con curvas con nombre, así que volver a exportar la clave una vez corrige las claves con parámetros explícitos para todas las bibliotecas.
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
Errores relacionados
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)