Saltar al contenido
ecdsa.com
Python cryptographycryptography de Python

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

Cómo solucionarlo

  1. 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. 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. 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

Explorar toda la base de datos de errores de firma