
在第一部分中,我们快速介绍了 S/MIME,查看了在一系列邮件客户端中对我们消息流的签名和加密。S/MIME 消息可以被签名(提供发件人身份的证明)、加密(保持消息内容的秘密)或两者兼而有之。

在本期中,我们将:
安装一些用于签名和加密电子邮件的简单命令行工具
获取您的发件人密钥/证书以进行签名
通过SparkPost发送签名消息,并查看接收到的消息
(可选)获取您的收件人证书以进行加密
通过SparkPost发送签名和加密的消息,并查看接收到的消息
尝试一个方便的独立工具“mimeshow”查看电子邮件文件内部结构。
好的——让我们开始吧!
2. 获取您的发件人密钥/证书以进行签名
3. 通过 SparkPost 发送签名消息
现在让我们使用一个真实的发送域,按照SparkPost New User Guide进行设置。我们在当前目录下有发件人证书和密钥文件:
steve@thetucks.com.crt steve@thetucks.com.pem
项目中包含文件tests/declaration.eml。这只是一个文本文件,所以您可以自定义From:地址以适应您自己的发送域和To:地址以适应您的测试接收者。文件开头看起来像这样:
To: Bob <bob.lumreeker@gmail.com> From: Steve <steve@thetucks.com> Subject: Here is our declaration MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB When in the Course of human events it becomes necessary …
设置您的API密钥:
export SPARKPOST_API_KEY=<<在这里放入您的API密钥>>
发送邮件:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
您将看到:
Opened connection to https://api.sparkpost.com/api/v1 发送tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob <bob.lumreeker@gmail.com> OK - in 1.15 seconds
大约一秒钟后,电子邮件到达Bob的Inbox。Thunderbird显示信封上有一个红点,表示有效的发件人签名。

成功!喝完那杯咖啡吧,你值得拥有。如果您遇到麻烦,请检查您邮件文件中的From:地址是否与您的.crt和.pem文件的名称匹配。
4. 加密消息
要加密一条信息,您需要接收者的公钥,以证书形式提供。这是一个看起来像这样的文本文件:
袋属性 友好名称: s COMODO CA Limited ID #2 本地密钥ID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 主题=/emailAddress=bob.lumreeker@gmail.com 发证者=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE----- 在此显示随机字符 -----END CERTIFICATE-----
测试目录中有一个用于 bob@example.com 的虚拟接收者证书,所以您可以在拥有真实证书之前进行练习:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
您将看到:
您将注意到,输出的长度比加密消息时长得多,因为它包含了许多额外信息以及被打乱的信息本身。
4.1 通过 SparkPost 发送加密、签名的消息
让我们将加密消息发送到一个真实的电子邮件地址。您可以遵循以前相同的过程(自签名或使用类似 Comodo 的提供者)来为您自己的接收者地址获取公钥/证书。您只需要 .crt 文件——接收者从不需要给您他们的私钥(.p12 和 .pem 文件)。
我有 bob.lumreeker@gmail.com.crt 文件 用于我打算的接收者——与我文件中的发件人地址匹配。
这是发送命令:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
我看到:
打开连接到 https://api.sparkpost.com/api/v1 发送 tests/declaration.eml 发件人: Steve <steve@thetucks.com> 收件人: Bob <bob.lumreeker@gmail.com> OK - 在 1.168 秒内
邮件在 Thunderbird 中显示红色点签名图标和“锁”加密图标。

您还可以轻松发送包含链接和图像的复杂 HTML 格式电子邮件,如第一部分所示。某些客户端如 Thunderbird 请求许可才能在加密的 S/MIME 消息中显示外部链接和图像,但仅签名的消息在包括 Thunderbird 和 Gmail 的客户端中表现良好:


注意下拉菜单显示“已验证的电子邮件地址”。
进一步的想法和需要注意的事项
这个工具采用了超简单的方法来拉取必要的密钥——它只是在当前目录中查找命名文件。更复杂的安排,例如将所有密钥保存在数据库中,可以很容易地添加,但我希望代码尽可能简单。
您可以包含其他收件人使用 Cc: 和 Bcc:,他们将会收到邮件;这对归档目的可能很有用。签名的邮件会被接收,其他收件人可以连同签名一起展示。工具会从已发送的邮件中去掉 Bcc: 标头(就像桌面邮件客户端一样)。
为了确保邮件通过 SparkPost 时不被更改(这可能会破坏签名),工具设置了 “transactional” 邮寄的 API 选项,并禁用了打开和点击跟踪。
如果您使用加密,请记住,该工具会为此提取单一的 To: 地址。只有当其他收件人拥有 To: 收件人的私钥时,才能解码邮件正文。如果您只是使用次要收件人作为发送记录,例如,那可能也是可以的。
签好、封好、送达...I’m yours
这是我们关于如何通过SparkPost签署、加密和发送S/MIME消息的快速概述。快速提醒:演示项目在Github上这里,我已尝试让安装和使用变得简单。
额外功能:使用“mimeshow”显示MIME部分
RFC822 MIME多部分文件内部结构对人类来说非常复杂。该项目包括一个名为mimeshow的独立工具,以简化这一过程。
这个工具可以处理任何你拥有的电子邮件文件(不仅仅是S/MIME的)并展示其内部结构。以下是一个例子:
./mimeshow.py testcases/img_and_attachment.eml
你会看到:
您还可以用作过滤器,以提供sparkpostSMIME输出的人类可读摘要:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
你会看到:
最后…
回顾一下——我们已经安装了一些简单的命令行工具用于签署和加密电子邮件(Github仓库在这里,附有安装说明)。
我们获得了用于签名的发件人密钥/证书,并通过SparkPost发送了一封签名的消息。我们获得了用于加密的收件人证书,然后通过SparkPost发送了一封签署且加密的消息。
最后,我们尝试了方便的独立工具“mimeshow”来查看电子邮件文件的内部。
现在就是这样!很快再见!