You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从X.509证书提取RSA公钥报错:ValueError: RSA key format is not supported

解决从X.509证书提取RSA公钥的ValueError问题

问题原因

  1. 参数传递错误:RSA.import_key()需要接收密钥/证书的字符串内容,而非文件名,你直接传入bob.crt文件名,导致无法解析。
  2. 格式不匹配:X.509证书包含完整的证书结构(公钥+签名+发行方/主体信息等),不是纯RSA公钥格式,无法直接用RSA.import_key()解析。

解决方法

使用PyCryptodome的Crypto.X509模块解析证书,提取公钥后转换为RSA密钥对象。修改后的代码如下:

from Crypto.PublicKey import RSA
from Crypto.X509 import load_pem_x509_certificate

# 读取证书文件内容
with open('bob.crt', 'r') as f:
    cert_content = f.read()

# 解析X.509证书(需将字符串转为字节流)
cert = load_pem_x509_certificate(cert_content.encode('utf-8'))
# 提取公钥并转换为RSA密钥对象
public_key = RSA.import_key(cert.public_key().export_key())

if isinstance(public_key, RSA.RsaKey):
    print("RSA public key")
else:
    print("Other key")

步骤说明

  1. 读取证书内容:通过open()读取证书文件的字符串内容,避免直接传递文件名给import_key。
  2. 解析证书:load_pem_x509_certificate()专门用于解析PEM格式的X.509证书,需传入字节流格式的证书内容。
  3. 提取并转换公钥:从证书对象中提取公钥,导出为标准PEM格式后,再用RSA.import_key()转换为RSA密钥对象。

替代方案(命令行提前提取公钥)

如果不想修改代码,可先用OpenSSL命令提取证书中的公钥,再用代码读取:

openssl x509 -in bob.crt -pubkey -noout > bob_public.pem

修改代码读取提取后的公钥文件:

from Crypto.PublicKey import RSA

with open('bob_public.pem', 'r') as f:
    pub_key_content = f.read()

public_key = RSA.import_key(pub_key_content)
if isinstance(public_key, RSA.RsaKey):
    print("RSA public key")
else:
    print("Other key")

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:01:10