古い電子メールの検索可能なアーカイブを作成する必要があり、その多くは S/MIME を使用して暗号化されています。
openssl を使用して .eml ファイルを復号化できます。これは機能します:
openssl smime -decrypt -in mails/example.eml -inkey certs/example.pem
しかし、python と M2crypto を使用して同じことをしようとすると、エラーが発生します。
emailfile='mails/example.eml'
# Instantiate an SMIME object.
s = SMIME.SMIME()
# Load private key and cert. can be one arg or two
s.load_key('certs/example.pem')
# Load the encrypted data.
try:
p7, data = SMIME.smime_load_pkcs7(emailfile)
except SMIME.SMIME_Error, e:
print 'Error: could not load {file} because {error}'.format(file=emailfile,error=e)
sys.exit()
# Decrypt p7.
try:
out = s.decrypt(p7,0)
print out
except SMIME.PKCS7_Error, e:
sys.stderr.write('Error: could not decrypt {file} because PKCS7 says {error}\n'.format(file=emailfile,error=e))
except SMIME.SMIME_Error, e:
sys.stderr.write('Error: could not decrypt {file} because SMIME {error}\n'.format(file=emailfile,error=e))
まったく同じ電子メール ファイルと、まったく同じ秘密鍵と証明書を含むまったく同じ .pem ファイルを使用してこのコードを実行すると、次のようになります。
Error: could not decrypt example.eml because PKCS7 says key values mismatch
トレースすると、署名の検証に失敗しているようです:
mailarcher.py(110): try:
mailarcher.py(111): out = s.decrypt(p7,0)
--- modulename: SMIME, funcname: decrypt
SMIME.py(182): if not hasattr(self, 'pkey'):
SMIME.py(184): if not hasattr(self, 'x509'):
SMIME.py(186): blob = m2.pkcs7_decrypt(pkcs7._ptr(), self.pkey._ptr(), self.x509._ptr(), flags)
--- modulename: SMIME, funcname: _ptr
SMIME.py(44): return self.pkcs7
--- modulename: EVP, funcname: _ptr
EVP.py(158): return self.pkey
--- modulename: X509, funcname: _ptr
X509.py(342): assert m2.x509_type_check(self.x509), "'x509' type error"
X509.py(343): return self.x509
mailarcher.py(113): except SMIME.PKCS7_Error, e:
mailarcher.py(114): sys.stderr.write('Error: could not decrypt {file} because PKCS7 says {error}\n'.format(file=emailfile,error=e))
設定できる NOVERIFY フラグがあるかどうかを確認し、s.decrypt 呼び出しでいくつかのフラグを試しましたが、役に立ちませんでした。
もちろん、スクリプトで openssl を呼び出すだけにすることもできますが、Python の方が簡単な処理 (複数の証明書、グループ リストなど) が他にもたくさんあるため、Python 内に留まりたいと思います。
誰でも提供できるヘルプをありがとう。