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

使用M2Crypto验证PKCS7签名报PKCS7_Error: no content如何解决

报错原因

M2Crypto.SMIME.PKCS7_Error: no content 报错的核心原因是你使用的PKCS7为**分离签名(detached signature)**格式:这类签名设计上就不会内嵌被签名的原始数据,M2Crypto的verify方法默认会优先从PKCS7结构内部读取待校验内容,找不到对应字段就会抛出该错误。

解决方法

根据你的使用场景选择对应方案即可:

场景1:持有签名对应的原始待校验数据

调用verify方法时补充传入原始数据,同时增加SMIME.PKCS7_DETACHED标识位,另外注意构造PEM格式签名时不要保留多余缩进,避免解析异常,修改后代码如下:

from M2Crypto import SMIME, X509, BIO

s = SMIME.SMIME()
# 构造PEM时去掉不必要的换行和缩进
sig = b"""-----BEGIN PKCS7-----
%s
-----END PKCS7-----
""" % verify_data

buf = BIO.MemoryBuffer(sig)
p7 = SMIME.load_pkcs7_bio(buf)
sk = X509.X509_Stack()
signers = p7.get0_signers(sk)
signer = signers[0]
sk.push(signer)
s.set_x509_stack(sk)
stor = X509.X509_Store()
stor.add_cert(signer)
s.set_x509_store(stor)

# 替换raw_data为你实际的原始待签名数据即可
v = s.verify(p7, raw_data, flags=SMIME.PKCS7_NOVERIFY | SMIME.PKCS7_DETACHED)

场景2:无原始数据,仅需提取PKCS7结构内的自带数据

如果你的目标不是做签名有效性校验,只是要提取PKCS7结构内的签名属性、证书等内容,可以直接解析ASN.1结构,用asn1crypto实现更简单:

from asn1crypto import cms

# 直接加载DER编码的PKCS7原始数据,无需转PEM格式
pkcs7 = cms.ContentInfo.load(verify_data)
signed_data = pkcs7['content']
# 提取签名者信息
signer_info = signed_data['signer_infos'][0]
# 提取已签名属性
signed_attrs = signer_info['signed_attrs']
# 提取结构内嵌的封装内容(如果存在)
encapsulated_content = signed_data['encap_content_info']['content']
# 提取签名所用的证书
certificate = signed_data['certificates'][0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:42:02