
在这个系列中,我们已经看到,包含 S/MIME 签名是相当直接的。发送 S/MIME 加密邮件则更复杂,因为您需要获取收件人的公钥。当您使用像 Thunderbird 这样的电子邮件客户端时,这是一回事,但应用程序生成的电子邮件流又如何运作呢?
在 part 1中,我们快速浏览了S/MIME,查看了在各种邮件客户端中签署和加密我们的消息流。Part 2带我们通过一个简单的命令行工具签署和加密电子邮件,然后通过SparkPost发送它们。Part 3展示了如何将安全邮件流注入到诸如Port25 PowerMTA和Momentum之类的本地平台中。
在这个系列中,我们看到包含S/MIME签名是相当简单的。发送S/MIME加密邮件更复杂,因为你需要获得收件人的公钥。当你使用像Thunderbird这样的邮件客户端时,那是一回事——但应用生成的电子邮件流如何工作呢?应用生成的电子邮件,如用于约会平台的那些,需要睿智的策略来最大化参与度。看看约会应用如何创建引人入胜的触发邮件体验。
但等等——进入Mordor获取那些密钥还有另一种方法。你的服务可以邀请你的客户(当然是通过邮件)给你发回一封未签名邮件到一个已知的客户服务地址。使用SparkPost Inbound Relay webhooks的神奇功能,我们将提取并存储供你使用的公钥。
我们可以将这总结为一个简单的用例:
作为消息的接收者,我提供你的服务我的个人电子邮件签名,以便将来可以以S/MIME加密形式向我发送邮件。
从这里,我们来推导一些更详细的需求:
我们需要一个始终在线的可靠入站电子邮件服务来接收这些签名电子邮件。
邮件格式不应有特殊要求,除了它应该包含S/MIME签名。
因为任何人都可以尝试向该服务发送邮件,它应该被设计成具有防御性的,例如,拒绝恶意行为者的“伪造”信息。需要有几个层次的检查。
如果一切检查无误,服务将使用众所周知的纯文本隐私增强邮件(PEM)格式将证书存储在一个文件中。
还有一些非功能性需求:
仅从对内部发生的响应来看,机器对机器的webhook服务可能很难看清。服务应提供详尽的人类可读的应用程序级日志。特别是,证书解析和检查应该被记录下来。
我们为应用内部添加了测试案例,使用很好的Pytest框架,并在使用Travis CI与GitHub集成时自动运行那些测试。
好的——让我们开始吧!
1. 解决方案概览
这是整体解决方案的样子。

2. 安装、配置和启动 web app
3. SparkPost inbound relay webhooks 设置
首先,我们选择一个域名作为我们的入站消息地址——在这里,它将是 inbound.thetucks.com。按照这个指南设置你的域名。以下是我详细使用的步骤:
3.1 添加 MX 记录
你将需要访问你特定互联网服务提供商的账户。完成后,你可以用 dig 检查它们——这是我域的命令。
你应该看到:
3.2 创建入站域
使用 SparkPost Postman API collection,选择 Inbound Domains / Create .. 调用。POST 请求的主体包含你的域,例如:

3.3 创建一个中继 Webhook
使用相关的 Postman 调用创建一个入站中继 webhook。在我的情况下,消息主体包含:
如前所述,我建议设置一个 auth_token为你自己的秘密值,正如在你的主机上的 webapp.ini 文件中设置的那样。
你的“target”值需要匹配你的主机地址和托管 web 应用的 TCP 端口。
你的“domain”值需要匹配在步骤1中设置的 MX 记录。

就这样!管道已经完成。你现在应该能够将证书发送到你的入站地址,它们将被处理并显示在你的 web 应用程序主机上——在这个例子中,是一个名为 bob.lumreeker@gmail.com.crt 的文件。
现在你可以使用本系列第 2 & 3 部分描述的工具将加密邮件发送给 Bob。
你可以使用以下命令检查证书的内容:
4. Internals: DKIM 检查, 证书验证
该应用程序检查接收到的电子邮件是否具有有效的DKIM,并检查证书本身的有效性,如此处所述。 其中还有实现说明和进一步工作的想法。
总结…
我们已经看到如何使用电子邮件轻松收集收件人的公钥,这是通过转入中继webhooks地址完成的。完成后,这些收件人可以接收S/MIME加密形式的消息。
就到这里!发送愉快。