
在这个系列中,我们已经看到,包含 S/MIME 签名是相当直接的。发送 S/MIME 加密邮件则更复杂,因为您需要获取收件人的公钥。当您使用像 Thunderbird 这样的电子邮件客户端时,这是一回事,但应用程序生成的电子邮件流又如何运作呢?
在第一部分中,我们快速浏览了S/MIME,了解了跨多个邮件客户端对消息流进行签名和加密的过程。第二部分通过一个简单的命令行工具来签名和加密邮件,然后通过SparkPost发送它们。第三部分展示了如何将安全邮件流注入到如Port25 PowerMTA和Momentum这样的本地平台中。
在这系列中,我们看到包含S/MIME签名是相当直接的。发送S/MIME加密邮件则更为复杂,因为您需要获取接收者的公钥。这在您使用如Thunderbird这样的邮件客户端时是一个事情 —— 但这如何在应用生成的邮件流中运作呢?
但等等 —— 有另一种进入Mordor的方法来获取那些密钥。您的服务可以邀请您的客户(当然通过邮件)发送一个签署的邮件到一个已知的客户服务地址。使用SparkPost Inbound Relay webhooks的神奇力量,我们将提取并存储那个公钥供您使用。
我们可以通过一个简单的用例总结这一点:
作为消息的接收者,我通过邮件向你的服务提供我的个人邮件签名,以便未来的邮件可以以S/MIME加密方式发送给我。
从这一点,我们推导出一些更详细的需求:
我们需要一个始终在线、可靠的入站邮件服务来接收这些签署的邮件。
邮件格式应无需任何特殊要求,只需携带S/MIME签名即可。
由于任何人都可以尝试向该服务发送邮件,服务设计应具有防御性,例如,拒绝来自不良行为者的“伪造”消息。需要进行多层次的检查。
如果一切检查正常,服务将使用众所周知的纯文本Privacy-Enhanced Mail (PEM)格式将证书存储在一个文件中。
还有一些非功能需求:
机器对机器的webhook服务可能仅通过响应看不到内部发生的情况。服务应提供广泛的人类可读的应用级日志。尤其是,证书解析和检查应被记录。
好了——让我们开始吧!
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加密形式的消息。
就到这里!发送愉快。