
在这个系列中,我们已经看到,包含 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 记录
您需要访问您的特定 Internet 服务提供商帐户。完成后,您可以使用 dig 检查它们——这是我的域名的命令。
dig +short MX inbound.thetucks.com
您应该看到:
10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com.
3.2 创建入站域
使用 SparkPost Postman API 集合,选择入站域/创建 .. 调用。POST 请求的主体包含您的域,例如:
{ "domain": "inbound.thetucks.com" }

3.3 创建中继 Webhook
使用相关的 Postman 调用创建一个入站中继 webhook。就我而言,消息主体包含:
{ "name": "Certificate Collection Webhook", "target": "https://app.trymsys.net:8855/", "auth_token": "t0p s3cr3t t0k3n", "match": { "protocol": "SMTP", "domain": "inbound.thetucks.com" } }
如前所述,我建议设置一个 auth_token为您自己的秘密值,如您主机上的 webapp.ini 文件中设置。
您的“target”值需要与您托管 Web 应用程序的主机地址和 TCP 端口匹配。
您的“domain”值需要与步骤 1 中设置的 MX 记录匹配。

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