1

着信 smime メッセージが有効であること (つまり、会社の秘密鍵で暗号化され、特定の公開鍵セットに署名されていること) を検証する一連の bash スクリプトを統合し、場合によっては書き直す必要があります。

この一連の bash は、おそらく M2Crypto の助けを借りて Python で作成された小さなアプリケーションに置き換えられます。

これまでのところ、復号化の部分はうまくいっていますが、署名の検証に問題があります。

この単一のbash行を置き換えるpythonコードを書く必要があります

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

to_verify.txt の内容は、「通常の」マルチパート/署名付き p7 であり、署名が添付されているかどうかに関係なく使用できます。

前のコマンドは、検証が成功すると 0 で終了し、smime エンベロープからコンテンツを抽出します。

ここで、m2crypto の例から取った Python に戻ります。

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 はコンテンツがないことをどのように報告できますか?

バンプ: 誰もこれに興味がありませんか?

4

3 に答える 3

0

M2Crypto v0.17を使用して、次の行を変更することにより、同様の問題を回避しました。

 v= s.verify(p7)

 v = s.verify(p7,data)
于 2010-11-15T15:57:02.760 に答える
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
于 2015-12-10T15:39:26.240 に答える
0

ケビンの答えは正しいです。

    v = s.verify(p7,data)

verify() メソッドは、署名されたメッセージの 2 つの部分 (プレーン テキストと暗号化されたテキスト) を比較する必要があります。

M2Crypto docに記載されているように、この関数はいくつかの引数を取ります。OpenSSL の docに記載されている openssl PKCS7_verify メソッドを呼び出します。M2Crypto のチュートリアルに誤ったデフォルト値が含まれているのは残念です (少なくとも私の環境では v0.20.1 で)。

于 2011-06-10T22:10:35.410 に答える