неправильное поведение m2crypto по сравнению с openssl

Мне нужно консолидировать и, возможно, переписать кучу сценариев bash, которые проверяют, что входящие смайл-сообщения действительны (т.е. зашифрованы закрытым ключом компании и подписаны определенным набором открытых ключей)

Этот набор bash будет заменен небольшим приложением, написанным, возможно, на Python с помощью M2Crypto.

До сих пор часть расшифровки действительно шла хорошо, но у меня возникла проблема с проверкой подписи.

Мне нужно написать код Python, который заменит эту единственную строку bash

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

Содержимое to_verify.txt представляет собой «обычный» составной/подписанный 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 может сообщить об отсутствии содержимого?

БУМП: никому это не интересно?


person niphlod    schedule 29.06.2010    source источник


Ответы (3)


Я решил аналогичную проблему, используя M2Crypto v0.17, изменив строку:

 v= s.verify(p7)

to

 v = s.verify(p7,data)
person Kevin    schedule 15.11.2010

Ответ Кевина правильный.

    v = s.verify(p7,data)

Метод Verify() должен сравнить две части подписанного сообщения (простой текст с зашифрованным).

Эта функция принимает несколько аргументов, как указано в документе M2Crypto. Он вызывает метод openssl PKCS7_verify, описанный в документе OpenSSL. К сожалению, руководство M2Crypto содержит ошибочные значения по умолчанию (по крайней мере, для версии 0.20.1 в моей среде).

person FabienB    schedule 10.06.2011

Это механизм, который я использую для проверки S/Mime с помощью M2Crypto.

# 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
person Ben Taylor    schedule 10.12.2015