与openssl相比,m2crypto的错误行为

时间:2010-06-29 10:50:06

标签: python m2crypto smime

我必须整合并可能重写一堆bash脚本,以验证传入的smime消息是否有效(即使用公司的私钥加密并签署一组公钥)

这一堆bash将被一个小应用程序所取代,在M2Crypto的帮助下可能用Python编写。

到目前为止,解密部分确实进展顺利,但我遇到了签名验证问题。

我需要编写将替换这个单行bash行的python代码

 openssl smime -verify -in to_verify.txt -CAfile signer_pubkey.pem -out verified.txt

to_verify.txt的内容是“通常”的multipart / signed p7,可以附加或不附加签名。

验证成功后,上一个命令以0退出,并从smime信封中提取内容。

现在,回到python,取自m2crypto示例:

import os
from M2Crypto import BIO, Rand, SMIME, X509
cert_dir = '/home/niphlod/certs'
doc_dir = '/home/niphlod/datastore'

signer = os.path.join(cert_dir, 'signer_pubkey.pem')
letter = os.path.join(doc_dir,'out_decrypt.txt')

# Instantiate an SMIME object.
s = SMIME.SMIME()

# Load the signer's cert. 
x509 = X509.load_cert(signer)
sk = X509.X509_Stack()
sk.push(x509)
s.set_x509_stack(sk)

# Load the signer's CA cert. They're all self-signed, hence the following
st = X509.X509_Store()
st.load_info(signer)
s.set_x509_store(st)

# Load the data, verify it.
p7, data = SMIME.smime_load_pkcs7(letter)
v = s.verify(p7)
print v
print data
print data.read()

嗯......出乎意料,我得到了

Traceback (most recent call last):
  File "m2crypto_verify.py", line 28, in <module>
    v = s.verify(p7)
  File "/usr/lib/pymodules/python2.6/M2Crypto/SMIME.py", line 215, in verify
    blob = m2.pkcs7_verify0(p7, self.x509_stack._ptr(), self.x509_store._ptr(), flags)
M2Crypto.SMIME.PKCS7_Error: no content

Openssl正在正确读取,提取和验证这些文件,但m2crypto如何报告没有内容?

BUMP:没人对此感兴趣吗?

3 个答案:

答案 0 :(得分:0)

我通过更改线路来解决使用M2Crypto v0.17的类似问题:

 v= s.verify(p7)

 v = s.verify(p7,data)

答案 1 :(得分:0)

凯文的答案是对的。

    v = s.verify(p7,data)

verify()方法需要比较签名消息的两部分(纯文本与加密消息)。

此函数采用M2Crypto doc中提到的一些参数。它调用OpenSSL's doc中记录的openssl PKCS7_verify方法。不幸的是,M2Crypto的教程包含错误的默认值(至少在我的环境中使用v0.20.1)。

答案 2 :(得分:0)

这是我用于使用M2Crypto进行S / Mime验证的机制

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

# Verify the data
#
try:
  if data is not None:
    v = s.verify(p7, data)
  else:
    v = s.verify(p7)
  if v:
    print 'Client signature verified'
except SMIME.SMIME_Error, e:
  print 'Error: message verification failed %s' % e