S/MIME 第 4 部分:通过 SparkPost 入站中继 Webhook 轻松收集收件人公钥
电子邮件
·
2019年2月1日

关键要点
前提: 一旦您能够自动收集每个收件人的公钥,发送S/MIME加密邮件就不难了。这篇文章通过使用SparkPost Inbound Relay Webhooks接收已签名的电子邮件、提取证书并存储以便后续加密,来弥合这一差距。
目标: 构建一个基于Flask的webhook服务,监听传入的已签名消息,验证它们(DKIM + 证书检查),并安全地将每个公钥写入磁盘以用于外发安全邮件。
重点:
问题: 手动密钥交换不适合应用程序生成的电子邮件。
解决方案: 邀请用户发送一封已签名的电子邮件;入站webhook自动解析并存储其PEM证书。
设置步骤:
配置一个Inbound Domain和MX记录(例如,inbound.yourdomain.com)。
通过SparkPost API创建一个Inbound Relay Webhook,指向您的应用程序端点。
使用webapp.ini中的配置部署一个小型Flask app(webapp.py)。
广泛记录以确保透明度;集成Pytest + Travis CI进行自动验证。
安全措施:
验证DKIM签名和消息真实性。
在存储前验证证书信任链。
在webhook头中使用一个秘密认证令牌。
输出:
每个有效的入站消息都会创建一个如bob.lumreeker@gmail.com.crt的证书文件。
一旦存储,这些密钥将启用使用第二部分和第三部分的早期脚本进行加密回复。
Q&A 精华
为什么收集收件人密钥对 S/MIME 如此重要?
因为加密需要每个收件人的公钥;自动化此步骤可让任何应用程序在无需手动交换的情况下发送安全邮件。
SparkPost Inbound Relay Webhook 如何简化 key collection?
它将任何签名的入站电子邮件转换为结构化的JSON负载,允许您的应用程序以编程方式解析和保存证书。
有哪些安全措施可以防止欺骗或垃圾提交?
该服务验证 DKIM 签名,实施身份验证令牌,并拒绝格式错误或未签名的消息。
证书存储在哪里,格式是什么?
它们以PEM格式(
.crt文件)写入磁盘,准备供前面部分构建的签名/加密工具链使用。开发人员的工作流程是什么?
运行 Flask 应用程序,使用提供的示例有效负载通过 Postman 验证,然后将其连接到 SparkPost 的实时 webhook 以实现连续运行。
总体体会?
S/MIME 密钥管理可以通过几行 Python 和 SparkPost APIs 完全自动化——为任何应用程序生成的电子邮件工作流程带来可扩展的加密。
在 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 应用
3. SparkPost 入站中继 webhook 设置
4. Internals: DKIM 检查, 证书验证
该应用程序检查收到的电子邮件是否具有有效的DKIM,并检查证书本身是否有效,如此处所述。这里也有一些实现备注以及关于进一步工作的想法。
总结一下……
我们已经看到,可以使用电子邮件轻松收集接收者的公钥以发送至入站中继 Webhooks 地址。完成后,这些接收者可以接收以 S/MIME 加密形式发送的消息。
目前就这些了!祝发送愉快。





