我正在尝试发送SMIME签名的电子邮件,但失败了。
我使用的是Python3,所以我选择了poor-smime-sign库。使用雷鸟接收,我要么收到一封空的电子邮件,上面有“未披露的收件人”,没有主题,这是签名的,或者我得到了整个邮件的纯文本,打印了一个巨大的base64斑点的消息-正文-没有签名的迹象(双关语意外,注意和保持原样)。
我已经将工作邮件(由Thunderbird在我的已发送文件夹中创建)的来源与我的franken- email进行了比较,但我看不出有什么不同。
代码如下:
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 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'))发布于 2017-06-28 17:20:39
TL;DR:
获得正确的标题:签名已经创建了一个标题。只需添加这些内容。没有空行。
好吧,原来我对电子邮件的工作原理一无所知。我确实想知道为什么我使用了两次TO-address (一次构造消息,一次在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内容类型: multipart/signed;protocol=3Dpapplication/x-Pkcs7-signature“;boundary=3D---DF20A931579CC3CE98F68AEF4D387131”icalg=3Dha-256";m=
这是一封S/MIME签名邮件
------DF20A931579CC3CE98F68AEF4D387131
我在代码的初始版本中运行它,在过程中生成两个头文件。一个包含收件人和主题,后缀为空行,然后添加签名邮件正文,该消息体具有另一个标头,其中包含SMIME信息,也以空行为后缀。这是行不通的。因此,删除空行(在标有"that line“的问题中)解决了这个问题。
因为我在stackexchange上没有找到任何示例,所以我想我应该把它写下来,这样我下次需要它的时候就可以找到它。
https://stackoverflow.com/questions/44798459
复制相似问题