【问题标题】:able to decrypt smime with openssl, but not with python and M2crypto能够使用 openssl 解密 smime,但不能使用 python 和 M2crypto
【发布时间】:2023-03-11 05:00:01
【问题描述】:

我必须为旧电子邮件创建一个可搜索的存档,其中许多是使用 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 会更容易。

感谢任何人提供的任何帮助。

【问题讨论】:

    标签: python email encryption m2crypto smime


    【解决方案1】:

    您是否尝试从解密行中删除“,0”?

    我看到的所有示例都没有使用类似的解密方法。对于验证功能,可以根据 data/data_bio 是否为 None 有条件地添加 data/data_bio。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 2014-07-09
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多