Pular para o conteúdo
ecdsa.com
Python cryptographyPython (cryptography)

Mensagem de erro

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

Também aparece 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)>

Conferido em várias versões: a cryptography 45.0 e posteriores acrescentam “Details: …” (por exemplo, “ASN.1 parsing error: short data”). As versões 43 e 44 lançam o texto como uma tupla com objetos de erro do OpenSSL e acrescentam “the provided password may be incorrect” à frase (e também usam essa mensagem para senhas erradas); as versões de 36 a 42 lançam a forma de tupla sem esse trecho.

Python cryptography — ValueError from load_pem_private_key / load_der_private_key / load_der_public_key

O que significa

A biblioteca cryptography encontrou dados de chave que não conseguiu transformar em um objeto de chave. Com uma entrada PEM, as linhas de delimitação estavam corretas (caso contrário, você veria “Unable to load PEM file”), então o problema está no DER interno: ele está truncado, tem uma estrutura diferente da que a função de carregamento espera ou descreve uma chave que a cryptography se recusa a carregar — chaves EC com parâmetros de curva explícitos ou chaves criptografadas com um algoritmo que ela não aceita. As versões recentes acrescentam “Details: …” com o motivo de baixo nível do ASN.1.

Por que acontece

Como corrigir

  1. 1.

    Verificar a chave com o OpenSSL primeiro

    Se o `openssl asn1parse` já falha, o arquivo está danificado — obtenha uma cópia nova. Se o OpenSSL carrega a chave e a cryptography não, examine a codificação da curva ou o algoritmo de criptografia.

    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 a função de carregamento que corresponde à chave

    Escolha entre as funções de carregamento de PEM, DER e OpenSSH com base nos próprios dados e use as funções de carregamento de chaves públicas para chaves 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.

    Converter parâmetros explícitos em uma curva nomeada

    O OpenSSL 3 grava chaves EC com curvas nomeadas por padrão, então exportar a chave de novo uma única vez corrige as chaves com parâmetros explícitos para todas as 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

Erros relacionados

Ver toda a base de erros de assinatura