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

关键要点
前提: 一旦您能够自动收集每个收件人的公钥,发送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集成时自动运行那些测试。
好的——让我们开始吧!
在 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集成时自动运行那些测试。
好的——让我们开始吧!
在 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 应用
我们将从这一部分开始,因此在处理入站中继webhooks前已进行充分测试。
网络应用程序包括在同一GitHub项目中,该项目的第1至3部分也包含在其中,因此如果你已经跟随那些部分,你已经拥有它。以下是新内容:
程序readSMIMEsig.py – 读取电子邮件并解析中间和用户证书。
程序webapp.py – 简单的与Flask兼容的网络应用程序,用于与SparkPost入站中继webhooks一起使用。
webapp.ini – 上述配置文件。配置文件使得相同的值可以轻松传递给命令行和网络应用程序。
你需要确保你的主机对外界的入站请求具有正确的TCP端口号开放,以便SparkPost可以将消息POST到你的应用上。如果你托管在AWS EC2上,例如,你需要配置实例的安全组。
配置和启动网络应用程序的说明提供在我们的设置指南中——这非常简单。要检查你的应用程序是否正在运行并从外界可访问,你可以使用例如curl从另一台主机发送(空白)请求:
curl -X POST https://app.trymsys.net:8855/
你应该看到类似的响应:
{"message":"Unknown Content-Type in request headers"}
这是好事——你的应用正在运行!
在你的主机上的webapp.log中,你将看到类似以下的输出:
2019-01-15 00:11:07,575,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None
为了帮助你立即在应用程序中使用真实数据,你可以从项目仓库中导入这个特定Postman请求。这模拟了你的SparkPost账户的操作,即发送一个包含特定有效证书(属于我一个测试账户)的https POST到你的应用程序中。
你只需要更改请求中的目标地址(在上面的灰框中)以匹配你的安装。如果你在webapp.ini中更改了令牌值,请调整Postman中的标头值以匹配。
如果你的应用程序正在运行,你将在Postman中看到“200 OK”的响应。你的主机webapp.log文件将包含如下输出:
2019-01-15 00:11:48,554,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passed 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificate: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificate: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| written file ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True
为了快速的健全性检查,寻找最后一行——如果它说“写入文件”,那么你就好了。这其余部分显示了DKIM检查和证书验证过程。
我们将从这一部分开始,因此在处理入站中继webhooks前已进行充分测试。
网络应用程序包括在同一GitHub项目中,该项目的第1至3部分也包含在其中,因此如果你已经跟随那些部分,你已经拥有它。以下是新内容:
程序readSMIMEsig.py – 读取电子邮件并解析中间和用户证书。
程序webapp.py – 简单的与Flask兼容的网络应用程序,用于与SparkPost入站中继webhooks一起使用。
webapp.ini – 上述配置文件。配置文件使得相同的值可以轻松传递给命令行和网络应用程序。
你需要确保你的主机对外界的入站请求具有正确的TCP端口号开放,以便SparkPost可以将消息POST到你的应用上。如果你托管在AWS EC2上,例如,你需要配置实例的安全组。
配置和启动网络应用程序的说明提供在我们的设置指南中——这非常简单。要检查你的应用程序是否正在运行并从外界可访问,你可以使用例如curl从另一台主机发送(空白)请求:
curl -X POST https://app.trymsys.net:8855/
你应该看到类似的响应:
{"message":"Unknown Content-Type in request headers"}
这是好事——你的应用正在运行!
在你的主机上的webapp.log中,你将看到类似以下的输出:
2019-01-15 00:11:07,575,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None
为了帮助你立即在应用程序中使用真实数据,你可以从项目仓库中导入这个特定Postman请求。这模拟了你的SparkPost账户的操作,即发送一个包含特定有效证书(属于我一个测试账户)的https POST到你的应用程序中。
你只需要更改请求中的目标地址(在上面的灰框中)以匹配你的安装。如果你在webapp.ini中更改了令牌值,请调整Postman中的标头值以匹配。
如果你的应用程序正在运行,你将在Postman中看到“200 OK”的响应。你的主机webapp.log文件将包含如下输出:
2019-01-15 00:11:48,554,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passed 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificate: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificate: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| written file ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True
为了快速的健全性检查,寻找最后一行——如果它说“写入文件”,那么你就好了。这其余部分显示了DKIM检查和证书验证过程。
我们将从这一部分开始,因此在处理入站中继webhooks前已进行充分测试。
网络应用程序包括在同一GitHub项目中,该项目的第1至3部分也包含在其中,因此如果你已经跟随那些部分,你已经拥有它。以下是新内容:
程序readSMIMEsig.py – 读取电子邮件并解析中间和用户证书。
程序webapp.py – 简单的与Flask兼容的网络应用程序,用于与SparkPost入站中继webhooks一起使用。
webapp.ini – 上述配置文件。配置文件使得相同的值可以轻松传递给命令行和网络应用程序。
你需要确保你的主机对外界的入站请求具有正确的TCP端口号开放,以便SparkPost可以将消息POST到你的应用上。如果你托管在AWS EC2上,例如,你需要配置实例的安全组。
配置和启动网络应用程序的说明提供在我们的设置指南中——这非常简单。要检查你的应用程序是否正在运行并从外界可访问,你可以使用例如curl从另一台主机发送(空白)请求:
curl -X POST https://app.trymsys.net:8855/
你应该看到类似的响应:
{"message":"Unknown Content-Type in request headers"}
这是好事——你的应用正在运行!
在你的主机上的webapp.log中,你将看到类似以下的输出:
2019-01-15 00:11:07,575,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None
为了帮助你立即在应用程序中使用真实数据,你可以从项目仓库中导入这个特定Postman请求。这模拟了你的SparkPost账户的操作,即发送一个包含特定有效证书(属于我一个测试账户)的https POST到你的应用程序中。
你只需要更改请求中的目标地址(在上面的灰框中)以匹配你的安装。如果你在webapp.ini中更改了令牌值,请调整Postman中的标头值以匹配。
如果你的应用程序正在运行,你将在Postman中看到“200 OK”的响应。你的主机webapp.log文件将包含如下输出:
2019-01-15 00:11:48,554,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passed 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificate: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificate: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| written file ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True
为了快速的健全性检查,寻找最后一行——如果它说“写入文件”,那么你就好了。这其余部分显示了DKIM检查和证书验证过程。
3. SparkPost 入站中继 webhook 设置
首先,我们选择一个域名作为我们的入站消息地址——这里,将使用inbound.thetucks.com。按照本指南设置您的域名。我详细使用的步骤如下:
3.1 添加MX记录
您需要访问您的特定互联网服务提供商账户。完成后,您可以使用dig检查它们——这是我域名的命令。
dig +short MX inbound.thetucks.com
您应该看到:
10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com
3.2 创建入站域
使用SparkPost Postman API集合,选择Inbound Domains / Create .. 调用。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的文件。
现在,您可以使用本系列第二和第三部分中描述的工具向Bob发送加密电子邮件。
您可以使用以下命令检查证书的内容:
openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout
首先,我们选择一个域名作为我们的入站消息地址——这里,将使用inbound.thetucks.com。按照本指南设置您的域名。我详细使用的步骤如下:
3.1 添加MX记录
您需要访问您的特定互联网服务提供商账户。完成后,您可以使用dig检查它们——这是我域名的命令。
dig +short MX inbound.thetucks.com
您应该看到:
10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com
3.2 创建入站域
使用SparkPost Postman API集合,选择Inbound Domains / Create .. 调用。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的文件。
现在,您可以使用本系列第二和第三部分中描述的工具向Bob发送加密电子邮件。
您可以使用以下命令检查证书的内容:
openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout
首先,我们选择一个域名作为我们的入站消息地址——这里,将使用inbound.thetucks.com。按照本指南设置您的域名。我详细使用的步骤如下:
3.1 添加MX记录
您需要访问您的特定互联网服务提供商账户。完成后,您可以使用dig检查它们——这是我域名的命令。
dig +short MX inbound.thetucks.com
您应该看到:
10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com
3.2 创建入站域
使用SparkPost Postman API集合,选择Inbound Domains / Create .. 调用。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的文件。
现在,您可以使用本系列第二和第三部分中描述的工具向Bob发送加密电子邮件。
您可以使用以下命令检查证书的内容:
openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout
4. Internals: DKIM 检查, 证书验证
该应用程序检查收到的电子邮件是否具有有效的DKIM,并检查证书本身是否有效,如此处所述。这里也有一些实现备注以及关于进一步工作的想法。
该应用程序检查收到的电子邮件是否具有有效的DKIM,并检查证书本身是否有效,如此处所述。这里也有一些实现备注以及关于进一步工作的想法。
该应用程序检查收到的电子邮件是否具有有效的DKIM,并检查证书本身是否有效,如此处所述。这里也有一些实现备注以及关于进一步工作的想法。
总结一下……
我们已经看到,可以使用电子邮件轻松收集接收者的公钥以发送至入站中继 Webhooks 地址。完成后,这些接收者可以接收以 S/MIME 加密形式发送的消息。
目前就这些了!祝发送愉快。
我们已经看到,可以使用电子邮件轻松收集接收者的公钥以发送至入站中继 Webhooks 地址。完成后,这些接收者可以接收以 S/MIME 加密形式发送的消息。
目前就这些了!祝发送愉快。
我们已经看到,可以使用电子邮件轻松收集接收者的公钥以发送至入站中继 Webhooks 地址。完成后,这些接收者可以接收以 S/MIME 加密形式发送的消息。
目前就这些了!祝发送愉快。



