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
O corpo base64 está incompleto ou foi alterado
comumUma linha perdida ao copiar a chave de um terminal ou de um gerenciador de segredos, uma chave truncada por um campo com limite de tamanho ou caracteres alterados por um editor. O cabeçalho e o rodapé continuam intactos, então a análise do PEM funciona e a do DER falha.
A função de carregamento não corresponde à estrutura da chave
comumUma chave pública passada para `load_der_private_key`, um certificado passado para uma função de carregamento de chaves ou uma chave no formato OpenSSH (`-----BEGIN OPENSSH PRIVATE KEY-----`) passada para `load_pem_private_key` em vez de `load_ssh_private_key`.
Chave EC com parâmetros de curva explícitos
ocasionalChaves geradas por algumas ferramentas antigas ou por exportações de HSM trazem por extenso o primo, os coeficientes e o gerador da curva em vez de identificar a curva pelo OID. A cryptography rejeita essas chaves de propósito (a RFC 5480 exige curvas nomeadas no PKIX).
Chave criptografada com um algoritmo que a cryptography não aceita
ocasionalArquivos PKCS#8 criptografados com esquemas PBE legados (por exemplo, PBE-SHA1-RC2 ou variantes de DES) não podem ser descriptografados pelos builds atuais. Criptografe-os novamente com AES (`openssl pkcs8 -topk8 -v2 aes-256-cbc`).
Como corrigir
- 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.
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.
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
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)