Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

S/MIME 第 3 部分:本地安全电子邮件的即插即用

电子邮件

1 min read

S/MIME 第 3 部分:本地安全电子邮件的即插即用

电子邮件

1 min read

S/MIME 第 3 部分:本地安全电子邮件的即插即用

在这一部分,我们将探讨如何将该工具调整为将邮件流注入本地平台,例如PowerMTA和Momentum。

第 1 部分中,我们快速浏览了S/MIME,查看了在各种邮件客户端中签署和加密我们的消息流。第 2 部分通过一个简单的命令行工具引导我们签署和加密电子邮件,然后通过 SparkPost 发送它们。

在这一部分,我们将看看如何调整该工具,以便将邮件流注入到本地平台,例如 Port25 PowerMTAMomentum

好的 - 让我们开始吧!

1. 入门指南

安装工具、获取密钥等与之前完全相同。当您使用的是本地邮件系统,如PowerMTAMomentum时,您已经负责设置发送域、DKIM密钥等。我们现在需要做的是提供某种方式将完全形成的S/MIME消息注入到您的服务器中。

2. SMTP 注入向 Port25 PowerMTA

PowerMTA 支持多种消息注入方式,包括文件“提取”目录、SMTP 和 API。这里使用的方法是 SMTP。

为了说明最简单的设置,我们将在与 PowerMTA 相同的服务器上安装 S/MIME 工具。我们将消息注入监听器,默认情况下该监听器在 TCP 端口 25 上开放,仅接受本地流量。

export SMTP_HOST=localhost

(如果您忘记了这一步,当您尝试运行时会看到:“Environment var SMTP_HOST not set – stopping”)

我们已经具备了发送者的私钥 (steve@thetucks.com.pem) 和接收者的公钥 (steve.tuck@sparkpost.com.crt)。消息文件的前几行是:

To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: This is a message created using HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit

我们发送消息使用:

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

我们看到:

Opened SMTP connection (plain) to localhost, port 25, user="", password="" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 seconds

消息迅速到达收件箱,并在 Mac Mail 上报告为已签名和加密。

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

额外功能:PowerMTA 的 DKIM

DKIM 非常容易配置,并且可以与 S/MIME 和谐共存。步骤如下:

  • 使用 PowerMTA DKIM 向导网站创建发送域的私钥(在我的例子中是 mypmta.thetucks.com.pem)和公用 DNS TXT 记录内容。

  • 设置 DNS TXT 记录,并选择一个选择器。例如,我使用的是选择器 pmta201811。有效的选择器字符定义在这里

  • 将 mypmta.thetucks.com.pem 文件放在服务器的 /etc/pmta 目录中。

  • 将以下内容添加到我的 /etc/pmta/config,并重启 pmta 服务。(在这里,这些指令写在全局范围内;在生产系统中,您可能更愿意将它们添加到虚拟 mta 下。)

host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *>    dkim-sign yes </domain>

通过 MX Toolbox 的 DNS 记录检查正常,DKIM 现在已激活。

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

PowerMTA 支持多种消息注入方式,包括文件“提取”目录、SMTP 和 API。这里使用的方法是 SMTP。

为了说明最简单的设置,我们将在与 PowerMTA 相同的服务器上安装 S/MIME 工具。我们将消息注入监听器,默认情况下该监听器在 TCP 端口 25 上开放,仅接受本地流量。

export SMTP_HOST=localhost

(如果您忘记了这一步,当您尝试运行时会看到:“Environment var SMTP_HOST not set – stopping”)

我们已经具备了发送者的私钥 (steve@thetucks.com.pem) 和接收者的公钥 (steve.tuck@sparkpost.com.crt)。消息文件的前几行是:

To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: This is a message created using HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit

我们发送消息使用:

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

我们看到:

Opened SMTP connection (plain) to localhost, port 25, user="", password="" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 seconds

消息迅速到达收件箱,并在 Mac Mail 上报告为已签名和加密。

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

额外功能:PowerMTA 的 DKIM

DKIM 非常容易配置,并且可以与 S/MIME 和谐共存。步骤如下:

  • 使用 PowerMTA DKIM 向导网站创建发送域的私钥(在我的例子中是 mypmta.thetucks.com.pem)和公用 DNS TXT 记录内容。

  • 设置 DNS TXT 记录,并选择一个选择器。例如,我使用的是选择器 pmta201811。有效的选择器字符定义在这里

  • 将 mypmta.thetucks.com.pem 文件放在服务器的 /etc/pmta 目录中。

  • 将以下内容添加到我的 /etc/pmta/config,并重启 pmta 服务。(在这里,这些指令写在全局范围内;在生产系统中,您可能更愿意将它们添加到虚拟 mta 下。)

host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *>    dkim-sign yes </domain>

通过 MX Toolbox 的 DNS 记录检查正常,DKIM 现在已激活。

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

PowerMTA 支持多种消息注入方式,包括文件“提取”目录、SMTP 和 API。这里使用的方法是 SMTP。

为了说明最简单的设置,我们将在与 PowerMTA 相同的服务器上安装 S/MIME 工具。我们将消息注入监听器,默认情况下该监听器在 TCP 端口 25 上开放,仅接受本地流量。

export SMTP_HOST=localhost

(如果您忘记了这一步,当您尝试运行时会看到:“Environment var SMTP_HOST not set – stopping”)

我们已经具备了发送者的私钥 (steve@thetucks.com.pem) 和接收者的公钥 (steve.tuck@sparkpost.com.crt)。消息文件的前几行是:

To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: This is a message created using HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit

我们发送消息使用:

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

我们看到:

Opened SMTP connection (plain) to localhost, port 25, user="", password="" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 seconds

消息迅速到达收件箱,并在 Mac Mail 上报告为已签名和加密。

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

额外功能:PowerMTA 的 DKIM

DKIM 非常容易配置,并且可以与 S/MIME 和谐共存。步骤如下:

  • 使用 PowerMTA DKIM 向导网站创建发送域的私钥(在我的例子中是 mypmta.thetucks.com.pem)和公用 DNS TXT 记录内容。

  • 设置 DNS TXT 记录,并选择一个选择器。例如,我使用的是选择器 pmta201811。有效的选择器字符定义在这里

  • 将 mypmta.thetucks.com.pem 文件放在服务器的 /etc/pmta 目录中。

  • 将以下内容添加到我的 /etc/pmta/config,并重启 pmta 服务。(在这里,这些指令写在全局范围内;在生产系统中,您可能更愿意将它们添加到虚拟 mta 下。)

host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *>    dkim-sign yes </domain>

通过 MX Toolbox 的 DNS 记录检查正常,DKIM 现在已激活。

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

3. SMTP 注入倾向于势头

Momentum 支持多种消息注入方式,包括 API 和 SMTP。这里使用的 SMTP 方法是朝着已经运行 Momentum 的主机进行的。我们将保持它的配置不变,因为它已经具备接受其他已批准主机的传入注入的能力。

这是生产设置的一个较小版本,其中“generation”节点和 MTA 节点是分开的,但通过私有 VLAN 和负载均衡器紧密耦合,承载内部 SMTP 注入流量。


Diagram showing email flow from a generation server to on-premises MTA (Mail Transfer Agent) via SMTP protocol.


S/MIME 工具与以前一样安装,我们将向 SMTP 主机(MTA)的地址注入消息:

export SMTP_HOST=xx.xx.xx.xx # 在此处设置您自己的 MTA / VIP 地址

与以前一样,我们已经在“generation”节点上拥有发件人的私钥 (steve@thetucks.com.pem) 和收件人的公钥 (steve.tuck@sparkpost.com.crt)。消息文件的前几行与这些地址匹配。

我们从“generation”节点完全使用以前相同的命令发送消息,消息显示在收件箱中。

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

正如您所预料的,S/MIME 也可以愉快地与 Momentum 的 DKIM signing 共存。

4. SMTP injection towards SparkPost

第二部分中,我们使用了SparkPost传输REST API来注入消息。当然,也可以使用SMTP将消息注入SparkPost。我们像这样设置环境变量:

export SMTP_PASSWORD=<<YOUR API KEY HERE>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587

如果您使用SparkPost 欧盟托管服务,那么将SMTP_HOST设置为smtp.eu.sparkpostmail.com。
请参阅此处查看更多选项——例如,您可以使用2525端口而不是587。)

下面的输出显示使用了STARTTLS,以及用户名和密码。

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

您将看到:

Opened SMTP connection (STARTTLS) to smtp.sparkpostmail.com, port 587, user="SMTP_Injection", password="****************************************" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.057 seconds

密码以替代***字符显示,因此即使有人在一旁窥视,您的密钥隐私也不会受到威胁。

保护您的凭据

请注意,可以在shell脚本文件或类似文件中设置环境变量,以免重复输入。如果这么做,请通过限制对该文件的访问来确保密码/API密钥的安全。例如,如果您的凭证设置文件名为my_envs.sh,则运行:

chmod 0700 my_envs.sh

您可能看到的SMTP相关警告

正如您对公共服务所期望的那样,SparkPost的SMTP注入非常严格。如果您没有设置SMTP端口号,您会看到警告:

{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}

如果您没有设置SMTP用户名或密码,您会看到:

(530, b'5.7.1 Authorization required. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')

这些错误消息是直接从Python SMTP库报告的,因此格式如此。

哪一个更快 – SMTP 或 API?

坦白说,S/MIME 不太可能成为一个高使用量的用例,但拥有同一个工具的两个输出选项,就像是在要求我们来场比赛!

这里使用的“Avocado”电子邮件测试文件约为19KB。通过 bash 循环重复测试 10 次,显示 SMTP 和 API 的平均时间相似,每条消息大约 60 毫秒,非常快。在这种情况下,我们从与 SparkPost.com 相同托管区域的中型 EC2 实例中注入,这是保持网络往返时间低的好方法。

使用更大的测试文件(577KB)重复此操作,API 大约需要 200 毫秒,而 SMTP 每条消息需要 280 毫秒——对于一个大 30 倍的文件大小来说仍然令人印象深刻。当然,您的具体情况可能会因位置、互联网拥堵等而异,但性能可能不成问题。

如果您确实需要最大性能,一个良好的起点是根据我们的传输最佳实践建议启动固定数量的并行注入进程/会话——例如,从主管任务中进行。

总结……

我们已经看到,在第2部分中使用的基于SparkPost API的工具已更新为支持SMTP注入,以支持如Port25 PowerMTAMomentum等的本地MTAs配置,以及与SparkPost一起使用的各种配置。

现在就这些!发送愉快。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

让我们为您联系Bird专家。
在30分钟内见证Bird的全部威力。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

R

Reach

G

Grow

M

Manage

A

Automate

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。