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

Mensagem de erro

Valid PEM but no BEGIN PUBLIC KEY/END PUBLIC KEY delimiters. Are you sure this is a public key?

Python cryptography — ValueError from load_pem_public_key

O que significa

O arquivo é um PEM bem formado — a delimitação é reconhecida —, mas o rótulo dele não é PUBLIC KEY. Você passou ao load_pem_public_key uma chave privada, um certificado ou um CSR. A biblioteca está perguntando, literalmente, se você escolheu o carregador certo para esse objeto.

Por que acontece

Como corrigir

  1. 1.

    Derivar a chave pública do que você realmente tem

    Todo contêiner que guarda material de chave pode fornecer a chave pública com uma chamada a mais.

    python
    from cryptography.hazmat.primitives.serialization import (
        load_pem_private_key, load_pem_public_key)
    from cryptography.x509 import load_pem_x509_certificate
    
    first = pem.splitlines()[0]
    if b"PRIVATE KEY" in first:
        public_key = load_pem_private_key(pem, password=None).public_key()
    elif b"CERTIFICATE" in first:
        public_key = load_pem_x509_certificate(pem).public_key()
    else:
        public_key = load_pem_public_key(pem)
  2. 2.

    Exportar um SPKI correto uma única vez

    Se um sistema precisa da chave pública avulsa repetidamente, gere o arquivo canônico BEGIN PUBLIC KEY e guarde-o.

    bash
    openssl pkey -in private.pem -pubout -out public.pem   # from a private key
    openssl x509 -in cert.pem -pubkey -noout > public.pem  # from a certificate
  3. 3.

    Nomear os arquivos pelo que eles contêm

    Metade dessas falhas são erros de organização dos arquivos, não de código: um server.pem com chave, certificado e cadeia concatenados, ou um public.pem gerado copiando a saída do comando errado. Guarde um objeto por arquivo, com o tipo do objeto no nome (orders-es256-public.pem), e toda essa categoria de erros de carregador trocado desaparece da base de código.

Erros relacionados

Ver toda a base de erros de assinatura