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
Chave privada passada ao carregador de chaves públicas
comumBlocos BEGIN PRIVATE KEY / BEGIN EC PRIVATE KEY exigem load_pem_private_key. Isso costuma acontecer quando um único item de configuração (“a chave”) atende a trechos de código que, na verdade, precisam de metades diferentes do par.
Certificado onde se espera a chave avulsa
comumUm bloco BEGIN CERTIFICATE contém uma chave pública dentro de uma estrutura X.509. Ele precisa ser carregado primeiro como certificado, para só depois extrair a chave — o rótulo PEM diz qual parser é responsável pelo objeto.
Rótulos incomuns, mas válidos
raraObjetos como BEGIN CERTIFICATE REQUEST (CSR) ou uma chave no formato OpenSSH colada em um arquivo .pem também falham nessa verificação — cada um tem o próprio carregador ou precisa ser convertido.
Como corrigir
- 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.
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.
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.