能够使用openssl解密smime,但不能使用python和M2crypto

3 投票
1 回答
1897 浏览
提问于 2025-04-18 16:38

我需要创建一个可以搜索的旧邮件档案,其中很多邮件是用S/MIME加密的。

我可以使用openssl解密.eml文件。这个方法是有效的:

openssl smime -decrypt -in mails/example.eml -inkey certs/example.pem

但是,当我尝试用python和M2crypto做同样的事情时,我遇到了一个错误。

emailfile='mails/example.eml'
# Instantiate an SMIME object.
s = SMIME.SMIME()

# Load private key and cert. can be one arg or two
s.load_key('certs/example.pem')

# Load the encrypted data.
try:
    p7, data = SMIME.smime_load_pkcs7(emailfile)
except SMIME.SMIME_Error, e:
    print 'Error: could not load {file} because {error}'.format(file=emailfile,error=e)
    sys.exit()

# Decrypt p7.
try:
    out = s.decrypt(p7,0)
    print out
except SMIME.PKCS7_Error, e:
    sys.stderr.write('Error: could not decrypt {file} because PKCS7 says {error}\n'.format(file=emailfile,error=e))
except SMIME.SMIME_Error, e:
    sys.stderr.write('Error: could not decrypt {file} because SMIME {error}\n'.format(file=emailfile,error=e))

当我用完全相同的邮件文件和完全相同的.pem文件,以及完全相同的私钥和证书运行这段代码时,我得到了:

Error: could not decrypt example.eml because PKCS7 says key values mismatch

追踪的时候,看起来是签名验证失败了:

mailarcher.py(110):     try:
mailarcher.py(111):         out = s.decrypt(p7,0)
 --- modulename: SMIME, funcname: decrypt
SMIME.py(182):         if not hasattr(self, 'pkey'):
SMIME.py(184):         if not hasattr(self, 'x509'):
SMIME.py(186):         blob = m2.pkcs7_decrypt(pkcs7._ptr(), self.pkey._ptr(), self.x509._ptr(), flags)
 --- modulename: SMIME, funcname: _ptr
SMIME.py(44):         return self.pkcs7
 --- modulename: EVP, funcname: _ptr
EVP.py(158):         return self.pkey
 --- modulename: X509, funcname: _ptr
X509.py(342):         assert m2.x509_type_check(self.x509), "'x509' type error"
X509.py(343):         return self.x509
mailarcher.py(113):     except SMIME.PKCS7_Error, e:
mailarcher.py(114):         sys.stderr.write('Error: could not decrypt {file} because PKCS7 says {error}\n'.format(file=emailfile,error=e))

我检查了一下,想看看是否有一个叫NOVERIFY的标志可以设置,并尝试了一些标志在s.decrypt调用中,但都没有效果。

当然,我可以让脚本直接调用openssl,但我希望能在python中完成,因为我还有很多其他的处理工作(多个证书、组列表等等),用python会更方便。

感谢任何人提供的帮助。

1 个回答

0

你有没有试着把解密那一行中的“,0”去掉?

我看到的例子里,没有哪个是用那种方式来解密的。对于验证功能来说,可以根据数据是否为空来决定是否添加数据/data_bio。

撰写回答