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

Mensagem de erro

Unable to load PEM file. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details. MalformedFraming

A frase antes do token é fixa; o token indica o que deu errado. MalformedFraming significa que as linhas BEGIN/END não foram encontradas; MismatchedTags("PRIVATE KEY", "PUBLIC KEY"), que elas não correspondem entre si; InvalidData(Invalid symbol 92, offset 0.), que o corpo não é base64 — 92 é uma barra invertida, sinal de sequências \n literais.

Python cryptography — ValueError from load_pem_* functions

O que significa

As funções load_pem_private_key / load_pem_public_key / load_pem_x509_certificate não encontraram uma delimitação PEM intacta — linhas BEGIN e END correspondentes, com um corpo em base64 entre elas. O token final (aqui, MalformedFraming) é o diagnóstico do parser; o link do FAQ vem dentro do próprio texto do erro.

Por que acontece

Como corrigir

  1. 1.

    Normalizar antes de carregar

    Restaure as quebras de linha, remova espaços em branco e aspas e confira a primeira linha antes de passar os bytes ao carregador.

    python
    import os
    pem = os.environ["PRIVATE_KEY"].replace("\\n", "\n").strip().strip('"').encode()
    assert pem.startswith(b"-----BEGIN"), pem[:30]
    
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    key = load_pem_private_key(pem, password=None)
  2. 2.

    Preferir arquivos ou segredos multilinha nativos

    Arquivos de segredo montados evitam por completo o problema do escape; os Secrets do Kubernetes e a maioria dos cofres de segredos conseguem entregar o PEM idêntico byte a byte.

    python
    with open("/run/secrets/signing_key.pem", "rb") as f:
        key = load_pem_private_key(f.read(), password=None)
  3. 3.

    Validar a delimitação mecanicamente

    Uma verificação rápida de que as linhas BEGIN/END existem e correspondem entre si restringe a falha ao conteúdo ou ao transporte.

    python
    lines = pem.decode().splitlines()
    print(lines[0])   # -----BEGIN PRIVATE KEY-----
    print(lines[-1])  # -----END PRIVATE KEY-----

Erros relacionados

Ver toda a base de erros de assinatura