跳到主要内容
ecdsa.com
Python cryptographyPython cryptography 库

错误信息

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

含义

文件是格式正确的 PEM——封装结构能够解析——但标签不是 PUBLIC KEY。你传给 load_pem_public_key 的是私钥、证书或 CSR。库其实是在直白地问你:是否为这个对象选对了加载函数。

原因

修复方法

  1. 1.

    从你实际拥有的对象推导出公钥

    凡是包含密钥材料的容器,只需再多调用一次就能得到公钥。

    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.

    一次性导出规范的 SPKI

    如果系统需要反复使用裸公钥,就生成规范的 BEGIN PUBLIC KEY 文件并保存它。

    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.

    按内容给文件命名

    这类失败有一半是文件管理错误,而不是代码错误:server.pem 里把密钥、证书和证书链拼在了一起,或者 public.pem 是复制了错误命令的输出得到的。每个文件只存放一个对象,并在文件名中写明对象类型(orders-es256-public.pem),这一整类加载函数不匹配的问题就会从代码库中消失。

相关错误

浏览完整的签名错误库