首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SMIME.smime_load_pkcs7 (_bio):M2Crypto.SMIME.SMIME_Error:无内容类型

SMIME.smime_load_pkcs7 (_bio):M2Crypto.SMIME.SMIME_Error:无内容类型
EN

Stack Overflow用户
提问于 2011-09-06 13:02:07
回答 4查看 2.7K关注 0票数 1

我在加载一个pkcs#7文件时遇到了问题,请您帮助我找出我做错了什么。

我使用OpenSSL 0.9.8g (如Ubuntu9.4中所示)运行M2Crypto0.21.1,并使用SWIG 1.3.36和python2.6.2构建。

"python测试套件=tests.test_smime“运行15个测试,退出状态为" ok ";因此,安装似乎是正常的。

我用一个数字签名程序创建了一个PEM格式的pkcs#7文件,并从命令行用OpenSSL对它进行了测试:

openssl小型-verify -inform -in mandato-PEM.p7m -noverify

它打印信封中包含的内容(我签名的文本文件)和“验证成功”。因此,OpenSSL (与M2Crypto使用的版本相同)似乎喜欢我的文件。

然而,当我在M2Crypto中尝试同样的方法时,它在开始时就会阻塞:

p7,data = SMIME.smime_load_pkcs7('mandato-PEM.p7m')

我得到以下例外:

回溯(最近一次调用):File "./sign.py",第110行,在p7中,data = SMIME.smime_load_pkcs7('mandato-PEM.p7m')文件第91行,在smime_load_pkcs7 p7_ptr中,bio_ptr = m2.smime_read_pkcs7(bio) M2Crypto.SMIME.SMIME_Error:无内容类型

虽然我已经在Ubuntu (https://lists.ubuntu.com/archives/ubuntu-server-bugs/2010-July/038683.html)中找到了一个问题的信息,但在我看来,这在这里并不适用,因为我手动构建了最新的M2Crypto,并且测试套件运行良好。

任何帮助解决我的问题将是非常感谢!

非常感谢

-bud

EN

回答 4

Stack Overflow用户

发布于 2011-09-09 14:31:20

经过大量的汗水,这里的解决方案为其他人遇到了同样的问题。

我遵循http://code.activestate.com/recipes/285211/的配方,发现网上有很多讨论,SMIME的“验证(P7)”方法是不正确的,“验证(p7,data)”是正确的。

这仅适用于分离签名的SMIME文档。我的pkcs#7文件和所有其他意大利数字签名文档都是既包含签名又包含文件内容的pkcs#7信封(以DER格式)。

封装的p7m文件必须按以下方式进行验证:

代码语言:javascript
复制
s=SMIME.SMIME()    
st = X509.X509_Store()   
st.load_info(trustedCAsPEMfileName)    
s.set_x509_store(st)    
p7bio = BIO.MemoryBuffer(p7strPEM)
p7 = SMIME.load_pkcs7_bio(p7bio)
certStack = p7.get0_signers(X509.X509_Stack())
s.set_x509_stack(certStack)
try:
    docContent = s.verify(p7)
except SMIME.PKCS7_Error, e:
    print "An exception occurred!!!!"
    print e

为了测试这是否有效,我编辑了p7m文件,使签名不再验证,并正确地打印出“摘要失败”。

票数 3
EN

Stack Overflow用户

发布于 2012-11-09 16:41:30

您还可以直接验证.p7m文件(附加DER格式),但是需要通过m2直接调用OpenSSL (m2.pkcs7_read_bio_der(input_bio._ptr()))从DER格式加载PKCS #7对象,因为在M2Crypto SMIME模块中没有此函数。有关建议的修补程序,请参阅到SMIME.py的小补丁

这里有一个示例代码:

代码语言:javascript
复制
import logging

from M2Crypto import SMIME, X509, m2, BIO

certstore_path = "/etc/ssl/certs/ca-certificates.crt"
file_descriptor = open('test_file.p7m', 'rb')
input_bio = BIO.File(file_descriptor)
signer = SMIME.SMIME()
cert_store = X509.X509_Store()
cert_store.load_info(certstore_path)
signer.set_x509_store(cert_store)
try: 
    p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(input_bio._ptr()), 1)
except SMIME.SMIME_Error, e:
    logging.error('load pkcs7 error: ' + str(e))
sk3 = p7.get0_signers(X509.X509_Stack())
signer.set_x509_stack(sk3)
data_bio = None
try:
    v = signer.verify(p7, data_bio)
except SMIME.SMIME_Error, e:
    logging.error('smime error: ' + str(e))
except SMIME.PKCS7_Error, e:
    logging.error('pkcs7 error: ' + str(e))

资料来源:吡肟芯

票数 2
EN

Stack Overflow用户

发布于 2018-12-20 10:19:04

如果您只想从.p7m one中提取原始文件(不需要验证),则需要安装带有pip install M2Crypto的M2Crypto (您可能必须在此之前运行sudo apt-get install libssl-dev ),然后运行以下pip install M2Crypto代码:

代码语言:javascript
复制
from M2Crypto import BIO, SMIME, X509

# Load file in memory just to showcase BIO usage
with open('file.p7m', 'rb') as file:
    p7m = file.read()

smime = SMIME.SMIME()
smime.set_x509_store(X509.X509_Store())
smime.set_x509_stack(X509.X509_Stack())
original_file_content = smime.verify(
    SMIME.load_pkcs7_bio_der(BIO.MemoryBuffer(p7m)),
    flags=SMIME.PKCS7_NOVERIFY
)

您可以根据用例使用SMIME.load_pkcs7SMIME.load_pkcs7_bioSMIME.load_pkcs7_der而不是SMIME.load_pkcs7_bio_der:内存中(_bio)或文件系统中的.p7m文件,以及PEM或DER (_der)格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7320325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档