You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将X.509证书导出的字符串格式公钥转换为PEM格式以实现签名验证?

解决X.509公钥字符串转PEM及签名验证问题

首先得明确:你直接用str(self.certificate.public_key())得到的字符串是Python公钥对象的默认字符串表示,完全不是标准的PEM格式,这就是转换失败的核心原因。正确的做法是从X.509证书中导出标准的PEM格式公钥,而不是直接转对象字符串。

发送方:正确导出PEM格式公钥

假设你用的是Python的cryptography库(处理X.509证书最常用的库),你需要用公钥对象的public_bytes()方法来生成标准PEM:

from cryptography.hazmat.primitives import serialization

# 从X.509证书中导出PEM格式的公钥(字符串)
pem_public_key = self.certificate.public_key().public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
).decode('utf-8')

# 组装待发送的消息
data['message'] = data_content  # 这里替换成你实际的消息内容
data['_signature'] = self.sign_data(data_content)  # 确保签名的是原始消息内容,而非整个data字典
data['_public_key'] = pem_public_key

注意:签名时一定要确保你签名的是原始消息内容(比如data_content),而不是已经包含签名和公钥的整个data字典,否则接收方验证时会因为内容不一致失败。

接收方:解析PEM公钥并验证签名

接收方拿到PEM格式的公钥字符串后,就可以轻松解析成公钥对象,然后验证签名:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization

# 1. 解析收到的PEM公钥字符串
public_key = serialization.load_pem_public_key(
    received_data['_public_key'].encode('utf-8')
)

# 2. 获取原始消息和签名
original_message = received_data['message']
signature = received_data['_signature']

# 3. 验证签名(这里假设你用的是RSA+SHA256,根据你实际签名算法调整)
try:
    public_key.verify(
        signature,
        original_message.encode('utf-8'),  # 若消息是字节则直接用
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("签名验证通过!")
except:
    print("签名验证失败!")

关键注意点

  • 确保发送方和接收方使用完全一致的签名算法、填充方式和哈希函数,否则验证一定会失败。
  • 如果你不用cryptography库,而是用其他工具(比如pyOpenSSL),核心逻辑是一样的:从证书中导出标准PEM格式公钥,而不是转对象字符串。

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

火山引擎 最新活动