从X.509证书提取RSA公钥报错:ValueError: RSA key format is not supported
解决从X.509证书提取RSA公钥的ValueError问题
问题原因
- 参数传递错误:
RSA.import_key()需要接收密钥/证书的字符串内容,而非文件名,你直接传入bob.crt文件名,导致无法解析。 - 格式不匹配: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")
步骤说明
- 读取证书内容:通过
open()读取证书文件的字符串内容,避免直接传递文件名给import_key。 - 解析证书:
load_pem_x509_certificate()专门用于解析PEM格式的X.509证书,需传入字节流格式的证书内容。 - 提取并转换公钥:从证书对象中提取公钥,导出为标准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
相关产品推荐
相关产品推荐

