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 支持多种消息注入方式,包括文件“pickup”目录、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 中报告为已签名和加密。

附加功能:使用 PowerMTA 的 DKIM

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

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

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

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

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

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

该 DNS 记录通过 MX Toolbox 检查无误,DKIM 现已激活。

PowerMTA 支持多种消息注入方式,包括文件“pickup”目录、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 中报告为已签名和加密。

附加功能:使用 PowerMTA 的 DKIM

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

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

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

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

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

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

该 DNS 记录通过 MX Toolbox 检查无误,DKIM 现已激活。

PowerMTA 支持多种消息注入方式,包括文件“pickup”目录、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 中报告为已签名和加密。

附加功能:使用 PowerMTA 的 DKIM

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

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

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

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

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

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

该 DNS 记录通过 MX Toolbox 检查无误,DKIM 现已激活。

3. SMTP 注入倾向于势头

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

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




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

第2部分中,我们使用了SparkPost传输的REST API来注入消息。当然,也可以使用SMTP将消息注入到SparkPost中。我们设置环境变量如下:

export SMTP_PASSWORD=<<您的API密钥在这里>> 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

您将看到:

打开的SMTP连接(STARTTLS)到smtp.sparkpostmail.com,端口587,用户="SMTP_Injection",密码="****************************************" 发送tests/fancy-HTML-to-smt.eml 来自:Steve <steve@thetucks.com> 至:SteveT <steve.tuck@sparkpost.com> OK - 在0.057秒内

密码以替换的***字符打印,因此如果有人在旁边看,您的密钥隐私不会受到威胁。

保护您的凭证

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

chmod 0700 my_envs.sh

您可能看到的SMTP相关警告

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

{'bob.lumreeker@gmail.com': (550, b'5.7.1 拒绝中继')}

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

(530, b'5.7.1 需要授权。参考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一起使用的各种配置。

现在就这些!发送愉快。

加入我们的Newsletter。

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

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

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

加入我们的Newsletter。

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

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

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

加入我们的Newsletter。

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

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

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

Pinterest 标志
Uber 标志
Square 徽标
Adobe 标志
Meta logo
PayPal 标志

Newsletter

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

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

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

Uber 标志
Square 徽标
Adobe 标志
Meta logo

Newsletter

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

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

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

Uber 标志
Adobe 标志
Meta logo

Reach

Grow

Manage

Automate

资源

公司

Newsletter

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

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

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