2017-06-28 10 views
0

私はSMIMEの署名付き電子メールを送信しようとしていますが失敗しています。貧弱な記号を使用した例

私はPython 3を使用しているので、poor-smime-signライブラリを選択しました。 Thunderbirdを使用して受信者が「非公開の受信者」となっていて、署名されていない件名がないか、全文がプレーンテキストで表示され、メッセージボディでbase64の巨大な塊署名する(意図しない、気付き、そのまま残す)。

作業用メールの送信元(送信フォルダのThunderbirdで作成)と私のフランケンメールを比較しましたが、違いはあまりありません。

ここではコードです:

from poor_smime_sign import smime_sign 
def signEmail(self, message :str) -> str: 
    """Sign the message-body. 

    The message is encoded in UTF-8, signed and then returned as Unicode. 

    Check this document on how to generate untrusted example-keys: 
    https://tools.ietf.org/doc/python-m2crypto/howto.smime.html 

    Check the settings ('invmail'->'keydir') where to put the keys. 
    The privateKey is called 'signer_key.pem' and publicKey 'signer.pem'. 
    """ 
    import os 
    privateKey = os.path.join(settings.SF.mail['keydir'], 'signer_key.pem') 
    publicKey = os.path.join(settings.SF.mail['keydir'], 'signer.pem') 

    try: 
     signed = smime_sign(publicKey, privateKey, message.encode('UTF-8')) 
    except Exception as e: 
     raise(Exception("Problem during signing: "+str(e))) 

    return signed.decode('UTF-8') 

poor_smime_signはところで私はかなり好きな彼らのモジュール、程度はかなり謙虚です。私は自分のコードを見て、彼らがしているのはopensslです。これは次のステップとして私がやったことです。トラブルシューティングをしている場合は、modに入り、実行されるコマンドをログに記録し、失敗した理由を理解するまでシェルでそれを実行することができます。 I pubとpriv certに間違ったやり方があり、本当に馬鹿馬鹿しいエラーメッセージが出ました。

これは、最後にメッセージをまとめたものです。私はどこかの例からそれをコピーしました。

body = self.signEmail(body) 
emailAr = [ 
    "From: %s" % emailFrom, 
    "To: %s"  % emailTo, 
    "Subject: %s" % subject, 
    "",    # <- that one 
    body, 
] 
message = "\r\n".join(emailAr) 
#... 
server.sendmail(emailFrom, [emailTo], message.encode('UTF-8')) 

答えて

0

TL; DR:

はヘッダーが権利を取得:署名が既にヘッダを作成します。ただそれに追加します。新しい空白行はありません。

メールはどのように動作するのかわかりませんでした。私は本当になぜTOアドレスを二度使用したのか(なぜなら、一度はメッセージを作り、sendmail()で一度)ということに疑問を抱いていましたが、私がそれを理解するまでにはしばらく時間がかかりました。私は何らかのヘッダーが必要だと知っていたが、どこで、なぜか分からなかった。

ソリューションは二重だった:

  1. 電子メールクライアントがそれをどうするかを知っているので、署名されるテキストは、ヘッダーを必要とします。私は周りに横たわっていた働く電子メールから1つを取った。

このようになります。

cannedHeader = "\r\n".join([ 
    "Content-Type: text/plain; charset=utf-8; format=flowed", 
    "Content-Language: de-DE", 
    "Content-Transfer-Encoding: quoted-printable", 
    "","" # emtpy new line concludes header 
]) 
body = cannedHeader+bodyInput 
body = self.signEmail(body) 
  • 署名されたメッセージボディは、既にそれに接続されている部分のヘッダが付いています。署名の結果を印刷すると、それは

    から始まります。

    MIMEバージョン:1.0コンテンツタイプ:multipart/signed; protocol = 3Dpplication/x-pkcs7-signature "; m = icalg = 3Dha-256"; 境界= 3D --- DF20A931579CC3CE98F68AEF4D387131"

    これは、S/MIME署名されたメッセージ

    ある------ DF20A931579CC3CE98F68AEF4D387131

    そして、私は、コードの最初のバージョンを介していることを実行し、このプロセスで2つのヘッダーを生成します。受信者と件名に空白の改行が追加され、SMIME情報を含む別のヘッダーを持つ署名付きメッセージ本文が追加され、空白の改行が追加されます。それはうまくいかない。だから、空行( "その行"と記されている質問)を削除すると、これが修正されました。

  • 私はstackexchangeのサンプルを見つけられませんでしたので、私はこれを書き留めると思っていましたので、次回に必要なときに見つけられます。

    関連する問題