【问题标题】:wrong behaviour of m2crypto compared to openssl与 openssl 相比,m2crypto 的错误行为
【发布时间】:2011-03-09 13:40:10
【问题描述】:

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

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

到目前为止,解密部分确实很顺利,但是我在签名验证方面遇到了问题。

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

 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:没有人对此感兴趣?

【问题讨论】:

    标签: python m2crypto smime


    【解决方案1】:

    这是我使用 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
    

    【讨论】:

      【解决方案2】:

      凯文的回答是对的。

          v = s.verify(p7,data)
      

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

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

      【讨论】:

        【解决方案3】:

        我使用 M2Crypto v0.17 通过更改行解决了类似的问题:

         v= s.verify(p7)
        

         v = s.verify(p7,data)
        

        【讨论】:

          猜你喜欢
          • 2012-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-16
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多