2012-05-08 12 views
8

現在、PGP署名のサポートをmy small e-mail sending script(Python 3.xとpython-gnupgモジュールを使用)に追加しようとしています。PGPで複数の電子メールをPythonで購読する

メッセージに署名し、コードされています(ここではbasemsgemail.message.Message型である。)

gpg = gnupg.GPG() 
basetext = basemsg.as_string().replace('\n', '\r\n') 
signature = str(gpg.sign(basetext, detach=True)) 
if signature: 
    signmsg = messageFromSignature(signature) 
    msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1", 
    protocol="application/pgp-signature") 
    msg.attach(basemsg) 
    msg.attach(signmsg) 
else: 
    print('Warning: failed to sign the message!') 

そしてmessageFromSignature機能は次のとおりです。

def messageFromSignature(signature): 
    message = Message() 
    message['Content-Type'] = 'application/pgp-signature; name="signature.asc"' 
    message['Content-Description'] = 'OpenPGP digital signature' 
    message.set_payload(signature) 
    return message 

その後、私は必要なすべてのヘッダを追加メッセージ(msg)に送信して送信します。

これはマルチパート以外のメッセージではうまく動作しますが、basemsgがマルチパート(multipart/alternativeまたはmultipart/mixed)であると失敗します。

対応するテキストとの署名を手動で検証しますが、EvolutionとMuttは署名が悪いと報告します。

誰かが私の間違いを指摘できますか?

答えて

5

問題は、Pythonのemail.generatorモジュールが署名部分の前に改行を追加しないことです。アップストリームはhttp://bugs.python.org/issue14983と報告しました。

+0

どうやってそれを修正しましたか?改行を簡単に追加する場所はありますか、またはemail.generatorをmonkeypatchしなければなりませんでしたか?私は同じ問題を抱えている。 – micah

+0

@MicahLee私は 'email.generator'にパッチを当てる(猿のような)以外の方法はありませんでした。 –

2

実際にはbasemsgというMIME構造は何ですか?それにはネストされた部分が多すぎるようです。たとえば、署名されたメッセージをエクスポートするとEvolutionでは、ボディとシグネチャの2つの部分だけがあることがわかります。

ここでは、mutt(mutt -f test.mbox)とEvolution(ファイル - >インポート)の両方で読み取ることができ、署名が検証されたstdout上にメッセージを生成する例を示します。

import gnupg 
from email.message import Message 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 

body = """ 
This is the original message text. 

:) 
""" 

gpg_passphrase = "xxxx" 

basemsg = MIMEText(body) 

def messageFromSignature(signature): 
    message = Message() 
    message['Content-Type'] = 'application/pgp-signature; name="signature.asc"' 
    message['Content-Description'] = 'OpenPGP digital signature' 
    message.set_payload(signature) 
    return message 

gpg = gnupg.GPG() 
basetext = basemsg.as_string().replace('\n', '\r\n') 
signature = str(gpg.sign(basetext, detach=True, passphrase=gpg_passphrase)) 
if signature: 
    signmsg = messageFromSignature(signature) 
    msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1", 
    protocol="application/pgp-signature") 
    msg.attach(basemsg) 
    msg.attach(signmsg) 
    msg['Subject'] = "Test message" 
    msg['From'] = "[email protected]" 
    msg['To'] = "[email protected]" 
    print(msg.as_string(unixfrom=True)) # or send 
else: 
    print('Warning: failed to sign the message!') 

ここでは、パスフレーズ付きの鍵リングを想定していますが、その必要はありません。

+0

私の質問は、** multipart **の電子メールへの署名方法でした。あなたのケースでは、 'basemsg'は、マルチパートメッセージではなく、単純なMIMETextメッセージです。 私の問題の根本を見つけました。これは、Pythonの 'email.generator'が終了境界の後に改行を追加しないために起こります。私はそれについてはあまりよく分かりません。私が確信できるようになると、それを修正する方法を説明した回答を投稿します。 –

+0

ドミトリーシャーシネフ:ああ、私は十分によく見ていませんでした。すぐにバグが修正されることを願っています! –

関連する問題