使用不良模糊标志的示例

时间:2017-06-28 09:20:39

标签: python-3.x email smime

我正在尝试发送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 btw对他们的模块非常谦虚,我非常喜欢。我查看了他们的代码,他们所做的只是调用openssl,这也是我将要做的,作为下一步。如果你正在进行故障排除,你可以进入mod并记录执行的命令并在shell中解决它,直到你理解它失败的原因。我,例如有错误的方式有pub和priv证书,并得到一个非常愚蠢的错误信息。

这就是将信息放在一起的原因。我从某处的某个例子中复制了它。

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'))

1 个答案:

答案 0 :(得分:0)

TL; DR:

正确获取标题:签名已创建标题。只需添加即可。没有空的新行。

好吧,事实证明我不知道电子邮件是如何运作的。我确实想知道为什么我两次使用TO地址(一次构建消息,一次使用sendmail())但是我花了一段时间才弄明白。我知道,我需要某种标题,但我不知道在哪里以及为什么。

解决方案有两个方面:

  1. 签名的文本需要标题,以便电子邮件客户端知道如何处理它。我从一个躺着的电子邮件中拿了一个。
  2. 看起来像这样。

    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)
    
    1. 已签名的邮件正文已附带一个部分标题。打印出签名结果,您会看到它以

      开头
        

      MIME-Version:1.0 Content-Type:multipart / signed;   protocol = 3Dpplication / x-pkcs7-signature“; m = icalg = 3Dha-256”;   边界= 3D --- DF20A931579CC3CE98F68AEF4D387131"

           

      这是一条S / MIME签名邮件

           

      ------ DF20A931579CC3CE98F68AEF4D387131

      我通过代码的初始版本运行它,在此过程中生成两个标头。一个收件人和主题后缀为空的新行,然后添加签名的邮件正文,其中包含另一个标题,包含SMIME信息,后面还有一个空的新行。那不行。因此,删除空行(在标有“该行”的问题中)修复此问题。

    2. 由于我没有在stackexchange上找到任何示例,我以为我会把它写下来,所以我可以在下次需要时找到它。