1

pkcs#7 ファイルの読み込みに問題があり、何が間違っているのかを理解するためにあなたの助けを求めてください。

M2Crypto-0.21.1 を OpenSSL 0.9.8g (Ubuntu 9.4 に存在) で実行し、SWIG 1.3.36 と python 2.6.2 でビルドしました。

「python setup.py test --test-suite=tests.test_smime」は、終了ステータス「OK」で 15 個のテストを実行します。ということで、インストールはOKのようです。

デジタル署名プログラムを使用して PEM 形式で pkcs#7 ファイルを作成し、コマンド ラインから OpenSSL でテストしました。

openssl smime -verify -inform PEM -in mandato-PEM.p7m -noverify

封筒に含まれる内容 (私が署名したテキスト ファイル) と「検証成功」を出力します。そのため、OpenSSL (M2Crypto で使用されているものと同じバージョン) が私のファイルを気に入っているようです。

ただし、M2Crypto で同じことを試してみると、最初はぎくしゃくします。

p7、データ = SMIME.smime_load_pkcs7('mandato-PEM.p7m')

次の例外が発生します。

Traceback (most recent call last):
File "./sign.py", line 110, in <module>
p7, data = SMIME.smime_load_pkcs7('mandato-PEM.p7m') 
File "/usr/local/lib/python2.6/dist-packages/M2Crypto-0.21.1-py2.6-linux-i686.egg/M2Crypto/SMIME.py", line 91, in smime_load_pkcs7
p7_ptr, bio_ptr = m2.smime_read_pkcs7(bio)
M2Crypto.SMIME.SMIME_Error: no content type

Ubuntu (https://lists.ubuntu.com/archives/ubuntu-server-bugs/2010-July/038683.html) で問題の情報が見つかりましたが、ビルドしたので、ここでは当てはまらないようです。最新の M2Crypto を手動でインストールすると、テスト スイートは正常に動作します。

私の問題を解決するための助けをいただければ幸いです。

どうもありがとう

-つぼみ

4

4 に答える 4

3

たくさんの汗をかいた後、ここで同じ問題に遭遇した他の人のための解決策.

私はレシピ http://code.activestate.com/recipes/285211/に従っていましたが、Web 上で「verify(p7)」[SMIME の方法] だけが正しくなく、「verify(p7, data )」は正しいことでした。

これは、署名が分離されている SMIME ドキュメントにのみ適用されます。私の pkcs#7 ファイル、および他のすべてのイタリアのデジタル署名されたドキュメントは、署名とファイル コンテンツ (DER 形式) の両方を含む pkcs#7 エンベロープです。

エンベロープされた p7m ファイルは、次のように検証する必要があります。

s=SMIME.SMIME()    
st = X509.X509_Store()   
st.load_info(trustedCAsPEMfileName)    
s.set_x509_store(st)    
p7bio = BIO.MemoryBuffer(p7strPEM)
p7 = SMIME.load_pkcs7_bio(p7bio)
certStack = p7.get0_signers(X509.X509_Stack())
s.set_x509_stack(certStack)
try:
    docContent = s.verify(p7)
except SMIME.PKCS7_Error, e:
    print "An exception occurred!!!!"
    print e

これが機能することをテストするために、署名が検証されなくなり、「ダイジェストの失敗」が正しく出力されるように p7m ファイルを編集しました。

于 2011-09-09T14:31:20.947 に答える
2

.p7mファイル(添付されたDER形式)を直接確認することもできますが、m2.pkcs7_read_bio_der(input_bio._ptr())M2Crypto SMIMEモジュール内にこの機能がないため、OpenSSL()へのm2直接呼び出しによってDER形式からPKCS#7オブジェクトをロードする必要があります。提案されたパッチについては、SMIME.pyへの小さなパッチを参照してください。

ここにサンプルコードがあります:

import logging

from M2Crypto import SMIME, X509, m2, BIO

certstore_path = "/etc/ssl/certs/ca-certificates.crt"
file_descriptor = open('test_file.p7m', 'rb')
input_bio = BIO.File(file_descriptor)
signer = SMIME.SMIME()
cert_store = X509.X509_Store()
cert_store.load_info(certstore_path)
signer.set_x509_store(cert_store)
try: 
    p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(input_bio._ptr()), 1)
except SMIME.SMIME_Error, e:
    logging.error('load pkcs7 error: ' + str(e))
sk3 = p7.get0_signers(X509.X509_Stack())
signer.set_x509_stack(sk3)
data_bio = None
try:
    v = signer.verify(p7, data_bio)
except SMIME.SMIME_Error, e:
    logging.error('smime error: ' + str(e))
except SMIME.PKCS7_Error, e:
    logging.error('pkcs7 error: ' + str(e))

コードソース:pysmimeコア

于 2012-11-09T16:41:30.400 に答える
0

署名と署名解除について私が見つけた最良のリファレンスは、ここの M2Crypto テストです。

http://svn.osafoundation.org/m2crypto/trunk/tests/test_smime.py

def test_sign(self):
    buf = BIO.MemoryBuffer(self.cleartext)
    s = SMIME.SMIME()
    s.load_key('tests/signer_key.pem', 'tests/signer.pem')
    p7 = s.sign(buf, SMIME.PKCS7_DETACHED)
    assert len(buf) == 0
    assert p7.type() == SMIME.PKCS7_SIGNED, p7.type()
    assert isinstance(p7, SMIME.PKCS7), p7
    out = BIO.MemoryBuffer()
    p7.write(out)

    buf = out.read()

    assert buf[:len('-----BEGIN PKCS7-----')] == '-----BEGIN PKCS7-----'
    buf = buf.strip()
    assert buf[-len('-----END PKCS7-----'):] == '-----END PKCS7-----', buf[-len('-----END PKCS7-----'):]
    assert len(buf) > len('-----END PKCS7-----') + len('-----BEGIN PKCS7-----')

    s.write(out, p7, BIO.MemoryBuffer(self.cleartext))
    return out

def test_verify(self):
    s = SMIME.SMIME()

    x509 = X509.load_cert('tests/signer.pem')
    sk = X509.X509_Stack()
    sk.push(x509)
    s.set_x509_stack(sk)

    st = X509.X509_Store()
    st.load_info('tests/ca.pem')
    s.set_x509_store(st)

    p7, data = SMIME.smime_load_pkcs7_bio(self.signed)

    assert isinstance(p7, SMIME.PKCS7), p7
    v = s.verify(p7, data)
    assert v == self.cleartext

    t = p7.get0_signers(sk)
    assert len(t) == 1
    assert t[0].as_pem() == x509.as_pem(), t[0].as_text()

ドキュメント (http://svn.osafoundation.org/m2crypto/trunk/doc/howto.smime.html) は更新されていないため、注意してください。

このパッチを参照してください:

https://bugzilla.osafoundation.org/show_bug.cgi?id=13020

于 2012-11-14T19:13:56.150 に答える