使用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
相关产品推荐
相关产品推荐

