我正在尝试发送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'))
答案 0 :(得分:0)
TL; DR:
正确获取标题:签名已创建标题。只需添加即可。没有空的新行。
好吧,事实证明我不知道电子邮件是如何运作的。我确实想知道为什么我两次使用TO地址(一次构建消息,一次使用sendmail())但是我花了一段时间才弄明白。我知道,我需要某种标题,但我不知道在哪里以及为什么。
解决方案有两个方面:
看起来像这样。
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-Version:1.0 Content-Type:multipart / signed; protocol = 3Dpplication / x-pkcs7-signature“; m = icalg = 3Dha-256”; 边界= 3D --- DF20A931579CC3CE98F68AEF4D387131"
这是一条S / MIME签名邮件
------ DF20A931579CC3CE98F68AEF4D387131
我通过代码的初始版本运行它,在此过程中生成两个标头。一个收件人和主题后缀为空的新行,然后添加签名的邮件正文,其中包含另一个标题,包含SMIME信息,后面还有一个空的新行。那不行。因此,删除空行(在标有“该行”的问题中)修复此问题。
由于我没有在stackexchange上找到任何示例,我以为我会把它写下来,所以我可以在下次需要时找到它。