首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用糟糕的smime-sign的示例

使用糟糕的smime-sign的示例
EN

Stack Overflow用户
提问于 2017-06-28 17:20:39
回答 1查看 201关注 0票数 0

我正在尝试发送SMIME签名的电子邮件,但失败了。

我使用的是Python3,所以我选择了poor-smime-sign库。使用雷鸟接收,我要么收到一封空的电子邮件,上面有“未披露的收件人”,没有主题,这是签名的,或者我得到了整个邮件的纯文本,打印了一个巨大的base64斑点的消息-正文-没有签名的迹象(双关语意外,注意和保持原样)。

我已经将工作邮件(由Thunderbird在我的已发送文件夹中创建)的来源与我的franken- email进行了比较,但我看不出有什么不同。

代码如下:

代码语言:javascript
复制
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,得到了一个非常愚蠢的错误消息。

这就是最终将信息组合在一起的原因。我从某处的某个示例中抄袭了它。

代码语言:javascript
复制
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'))
EN

回答 1

Stack Overflow用户

发布于 2017-06-28 17:20:39

TL;DR:

获得正确的标题:签名已经创建了一个标题。只需添加这些内容。没有空行。

好吧,原来我对电子邮件的工作原理一无所知。我确实想知道为什么我使用了两次TO-address (一次构造消息,一次在sendmail()中),但我花了一段时间才弄明白。我知道,我需要一些标题,但我不知道在哪里,为什么。

解决方案有两个:

  1. 签名的文本需要一个标题,以便电子邮件客户端知道如何处理它。我从我随处可见的一封工作邮件中拿到了一封。

看起来像这样。

代码语言:javascript
复制
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内容类型: multipart/signed;protocol=3Dpapplication/x-Pkcs7-signature“;boundary=3D---DF20A931579CC3CE98F68AEF4D387131”icalg=3Dha-256";m=

这是一封S/MIME签名邮件

------DF20A931579CC3CE98F68AEF4D387131

我在代码的初始版本中运行它,在过程中生成两个头文件。一个包含收件人和主题,后缀为空行,然后添加签名邮件正文,该消息体具有另一个标头,其中包含SMIME信息,也以空行为后缀。这是行不通的。因此,删除空行(在标有"that line“的问题中)解决了这个问题。

因为我在stackexchange上没有找到任何示例,所以我想我应该把它写下来,这样我下次需要它的时候就可以找到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44798459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档