Mensaje de error
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
Qué significa
El archivo es un PEM bien formado —la delimitación se analiza sin problemas—, pero su etiqueta no es PUBLIC KEY. Se pasó a load_pem_public_key una clave privada, un certificado o una CSR. La biblioteca te pregunta, literalmente, si este es el cargador correcto para este objeto.
Por qué ocurre
Clave privada pasada al cargador de claves públicas
frecuenteLos bloques BEGIN PRIVATE KEY / BEGIN EC PRIVATE KEY necesitan load_pem_private_key. Suele ocurrir cuando una sola entrada de configuración («la clave») alimenta rutas de código que en realidad necesitan mitades distintas del par.
Certificado donde se espera la clave sin envolver
frecuenteBEGIN CERTIFICATE contiene una clave pública dentro de una estructura X.509. Primero hay que cargarlo como certificado y después extraer la clave: la etiqueta PEM indica a qué analizador corresponde el objeto.
Etiquetas poco habituales pero válidas
raraObjetos como BEGIN CERTIFICATE REQUEST (CSR) o una clave en formato OpenSSH pegada en un archivo .pem tampoco superan esta comprobación: cada uno tiene su propio cargador o necesita una conversión.
Cómo solucionarlo
- 1.
Derivar la clave pública de lo que realmente tienes
Cualquier contenedor con material de clave puede proporcionar la clave pública con una llamada adicional.
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 una sola vez un SPKI correcto
Si un sistema necesita la clave pública sin envolver una y otra vez, genera el archivo canónico BEGIN PUBLIC KEY y guarda ese.
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.
Nombrar los archivos según lo que contienen
La mitad de estos fallos son errores de organización de archivos, no errores de código: un server.pem con la clave, el certificado y la cadena concatenados, o un public.pem creado al copiar la salida del comando equivocado. Guarda un objeto por archivo, con el tipo de objeto en el nombre (orders-es256-public.pem), y toda esta clase de discrepancias de cargador desaparece del código base.