Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

S/MIME 第 2 部分:通过 SparkPost 签名、密封和交付

电子邮件

1 min read

S/MIME 第 2 部分:通过 SparkPost 签名、密封和交付

电子邮件

1 min read

S/MIME 第 2 部分:通过 SparkPost 签名、密封和交付

在第一部分中,我们快速介绍了 S/MIME,查看了在一系列邮件客户端中对我们消息流的签名和加密。S/MIME 消息可以被签名(提供发件人身份的证明)、加密(保持消息内容的秘密)或两者兼而有之。

在这个部分中,我们将:

  • 安装一些简单的命令行工具来签名和加密电子邮件

  • 获取用于签名的发送者密钥/证书

  • 通过SparkPost发送签名消息,并查看接收到的消息

  • 可选地,获取用于加密的接收者证书

  • 通过SparkPost发送签名和加密的消息,并查看接收到的消息

  • 尝试使用一个方便的独立工具“mimeshow”来查看电子邮件文件的内部结构。

好的——让我们开始吧!

1. 安装工具

这些演示工具在 Github 这里,以及完整的安装说明。您可能会注意到“构建通过”标志——Travispytest 自动检查构建状态。请注意,这些工具并未获得 SparkPost 的官方支持,但我已尝试使其强大且易于使用。

如果您对 Python 和 pip 有一些了解,安装过程应该会感觉非常熟悉。Pipfile 会自动为您处理外部依赖。一旦完成,您可以通过运行以下命令检查所有内容是否已安装:

./sparkpostSMIME.py -h

您应该会看到友好的帮助文本。接下来,我们需要…

2. 获取您的发件人密钥/证书以进行签名

如果您已经有用于发送身份的密钥文件,则可以跳过。否则这里有两个选项可供选择:

a) 自签名测试密钥/证书(无外部有效性)

如果您只是测试,可以使用 Linux 上的命令行工具 openssl 为邮箱地址创建“自签名”证书和密钥,按照例如此程序。在该过程结束时,您将拥有一个 smime.p12 文件。重命名这个文件以匹配您的发送身份,包括 @ 符号,例如,alice@example.com.p12。

b) 外部有效的密钥/证书

如果您想获取外部有效的密钥/证书以便签名,这里有一个供应商列表在这里。我发现Comodo效果很好(免费用于非商业用途),而且比上述自签程序简单。按照注册流程,接收您的验证邮件,并确保在 Firefox 中打开链接。进入 Firefox 偏好设置 / 隐私和安全性。滚动到证书/查看证书:




选择您的证书,并使用“备份”选项以PKCS12格式保存为文件(在文件名中添加文件扩展名 .p12),该格式携带私钥和公用证书链。




提供一个密码来保护 .p12 文件:

生成单独的公用 (.crt) 和私用 (.pem) 密钥文件

无论您使用 a) 还是 b),您现在将拥有一个 .p12 文件用于您的发件人身份。这是一个巨大的进步——现在喝一杯咖啡吧!

现在我们需要生成这样的单独的公用和私用密钥文件——用您自己的邮箱地址替代示例中的地址。(Mac OSX 和 Linux):

openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem

您需要输入先前提供的密码。注意这些反斜杠 \ 用于转义 @ 符号——而不是分隔目录路径的名称(在 Mac OSX 和 Linux 上使用正斜杠 /)。

如果您使用的是 Windows,有可用的 openssl 实现,例如内置于Git 命令行工具中的 MINGW64,但我发现它往往会锁住。您可能会发现这样更容易和更快在 Linux 上完成,然后将文件复制过来。那些 Windows 的 Git 工具也带有一个不错的 ssh 客户端,您可以使用它登录到 Linux 机器,例如 Amazon EC2 实例。




2.1 签署一条信息

测试目录中已为 alice@example.com 提供了一个示例密钥/证书和邮件源文件,因此即使您没有自己的密钥,也可以获取一些输出。只需输入以下内容:

cd tests ../sparkpostSMIME.py example_email1.eml --sign

然后您将得到:

To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: 一条消息 MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :

您实际上无法通过 SparkPost 从 example.com 发送电子邮件,除非您拥有该域,因此下一步是使用您自己的密钥并从您自己的域发送签名消息。

如果您已经有用于发送身份的密钥文件,则可以跳过。否则这里有两个选项可供选择:

a) 自签名测试密钥/证书(无外部有效性)

如果您只是测试,可以使用 Linux 上的命令行工具 openssl 为邮箱地址创建“自签名”证书和密钥,按照例如此程序。在该过程结束时,您将拥有一个 smime.p12 文件。重命名这个文件以匹配您的发送身份,包括 @ 符号,例如,alice@example.com.p12。

b) 外部有效的密钥/证书

如果您想获取外部有效的密钥/证书以便签名,这里有一个供应商列表在这里。我发现Comodo效果很好(免费用于非商业用途),而且比上述自签程序简单。按照注册流程,接收您的验证邮件,并确保在 Firefox 中打开链接。进入 Firefox 偏好设置 / 隐私和安全性。滚动到证书/查看证书:




选择您的证书,并使用“备份”选项以PKCS12格式保存为文件(在文件名中添加文件扩展名 .p12),该格式携带私钥和公用证书链。




提供一个密码来保护 .p12 文件:

生成单独的公用 (.crt) 和私用 (.pem) 密钥文件

无论您使用 a) 还是 b),您现在将拥有一个 .p12 文件用于您的发件人身份。这是一个巨大的进步——现在喝一杯咖啡吧!

现在我们需要生成这样的单独的公用和私用密钥文件——用您自己的邮箱地址替代示例中的地址。(Mac OSX 和 Linux):

openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem

您需要输入先前提供的密码。注意这些反斜杠 \ 用于转义 @ 符号——而不是分隔目录路径的名称(在 Mac OSX 和 Linux 上使用正斜杠 /)。

如果您使用的是 Windows,有可用的 openssl 实现,例如内置于Git 命令行工具中的 MINGW64,但我发现它往往会锁住。您可能会发现这样更容易和更快在 Linux 上完成,然后将文件复制过来。那些 Windows 的 Git 工具也带有一个不错的 ssh 客户端,您可以使用它登录到 Linux 机器,例如 Amazon EC2 实例。




2.1 签署一条信息

测试目录中已为 alice@example.com 提供了一个示例密钥/证书和邮件源文件,因此即使您没有自己的密钥,也可以获取一些输出。只需输入以下内容:

cd tests ../sparkpostSMIME.py example_email1.eml --sign

然后您将得到:

To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: 一条消息 MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :

您实际上无法通过 SparkPost 从 example.com 发送电子邮件,除非您拥有该域,因此下一步是使用您自己的密钥并从您自己的域发送签名消息。

如果您已经有用于发送身份的密钥文件,则可以跳过。否则这里有两个选项可供选择:

a) 自签名测试密钥/证书(无外部有效性)

如果您只是测试,可以使用 Linux 上的命令行工具 openssl 为邮箱地址创建“自签名”证书和密钥,按照例如此程序。在该过程结束时,您将拥有一个 smime.p12 文件。重命名这个文件以匹配您的发送身份,包括 @ 符号,例如,alice@example.com.p12。

b) 外部有效的密钥/证书

如果您想获取外部有效的密钥/证书以便签名,这里有一个供应商列表在这里。我发现Comodo效果很好(免费用于非商业用途),而且比上述自签程序简单。按照注册流程,接收您的验证邮件,并确保在 Firefox 中打开链接。进入 Firefox 偏好设置 / 隐私和安全性。滚动到证书/查看证书:




选择您的证书,并使用“备份”选项以PKCS12格式保存为文件(在文件名中添加文件扩展名 .p12),该格式携带私钥和公用证书链。




提供一个密码来保护 .p12 文件:

生成单独的公用 (.crt) 和私用 (.pem) 密钥文件

无论您使用 a) 还是 b),您现在将拥有一个 .p12 文件用于您的发件人身份。这是一个巨大的进步——现在喝一杯咖啡吧!

现在我们需要生成这样的单独的公用和私用密钥文件——用您自己的邮箱地址替代示例中的地址。(Mac OSX 和 Linux):

openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem

您需要输入先前提供的密码。注意这些反斜杠 \ 用于转义 @ 符号——而不是分隔目录路径的名称(在 Mac OSX 和 Linux 上使用正斜杠 /)。

如果您使用的是 Windows,有可用的 openssl 实现,例如内置于Git 命令行工具中的 MINGW64,但我发现它往往会锁住。您可能会发现这样更容易和更快在 Linux 上完成,然后将文件复制过来。那些 Windows 的 Git 工具也带有一个不错的 ssh 客户端,您可以使用它登录到 Linux 机器,例如 Amazon EC2 实例。




2.1 签署一条信息

测试目录中已为 alice@example.com 提供了一个示例密钥/证书和邮件源文件,因此即使您没有自己的密钥,也可以获取一些输出。只需输入以下内容:

cd tests ../sparkpostSMIME.py example_email1.eml --sign

然后您将得到:

To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: 一条消息 MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :

您实际上无法通过 SparkPost 从 example.com 发送电子邮件,除非您拥有该域,因此下一步是使用您自己的密钥并从您自己的域发送签名消息。

3. 通过 SparkPost 发送签名消息

现在让我们使用一个真实的发送域,按照 SparkPost 新用户指南设置。我们在当前目录下有发送者证书和密钥文件:

steve@thetucks.com.crt steve@thetucks.com.pem

文件 tests/declaration.eml 包含在项目中。这只是一个文本文件,所以您可以自定义 From: 地址以适应您自己的发送域,自定义 To: 地址以适应您的测试收件人。文件的开头看起来像这样:

To: Bob <bob.lumreeker@gmail.com> From: Steve <steve@thetucks.com> Subject: 这里是我们的声明 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB When in the Course of human events it becomes necessary …




设置您的 API 密钥:

export SPARKPOST_API_KEY=<<在此输入您的 API 密钥>>

发送电子邮件:

./sparkpostSMIME.py tests/declaration.eml --sign --send_api




您会看到:

打开连接到 https://api.sparkpost.com/api/v1 发送 tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob  <bob.lumreeker@gmail.com> OK - 在 1.15 秒内

大约一秒钟后,邮件到达 Bob 的收件箱。Thunderbird 显示信封上有一个红点,表示有效的发送者签名。

成功!喝完那杯咖啡,你值得。如果您遇到问题,请检查电子邮件文件中的 From: 地址是否与您的 .crt 和 .pem 文件的名称匹配。

4. 加密消息

要加密消息,您需要以证书形式接收者的公钥。这是一个文本文件,看起来像这样:

Bag Attributes   friendlyName: s COMODO CA Limited ID #2   localKeyID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 subject=/emailAddress=bob.lumreeker@gmail.com issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE-----这里看起来像是随机字符-----END CERTIFICATE-----

在测试目录中,有一个供bob@example.com使用的测试接收者证书,因此可以在拥有正式证书之前进行练习:

cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt




您将看到:




To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: 一条消息 MIME-Version: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :

您会注意到输出长度比加密消息长很多,因为它包含了很多额外的信息以及被加密的信息本身。




4.1 通过SparkPost发送加密签名的消息

我们来发送一封加密消息到一个真实的电子邮件地址。您可以按照之前的步骤(自签名或使用Comodo等提供商)为自己的接收者地址获取公钥/证书。您只需要.crt文件——接收者需要给您他们的私钥(.p12和.pem文件)。

我有文件bob.lumreeker@gmail.com.crt,匹配我文件中的From:地址。

以下是发送的命令:

./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api




我看到:

已打开连接至https://api.sparkpost.com/api/v1,发送tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob <bob.lumreeker@gmail.com> OK - 在1.168秒内

邮件在Thunderbird中显示带有“红点”签名图标和“挂锁”加密图标。




您可以发送复杂的基于HTML的电子邮件,包含链接和图片,如第一部分所示。某些客户端如Thunderbird在加密的S/MIME消息内会要求显示外部链接和图片的权限,但仅签名的消息在包括Thunderbird和Gmail的客户端中显示良好:




请注意下拉列表显示“已验证的电子邮件地址”。

进一步的想法和需要注意的事项

这个工具采用了超简单的方法来拉取必要的密钥——它只是在当前目录中查找命名文件。更复杂的安排,例如将所有密钥保存在数据库中,可以很容易地添加,但我希望代码尽可能简单。

您可以包含其他收件人使用 Cc: 和 Bcc:,他们将会收到邮件;这对归档目的可能很有用。签名的邮件会被接收,其他收件人可以连同签名一起展示。工具会从已发送的邮件中去掉 Bcc: 标头(就像桌面邮件客户端一样)。

为了确保邮件通过 SparkPost 时不被更改(这可能会破坏签名),工具设置了 “transactional” 邮寄的 API 选项,并禁用了打开和点击跟踪。

如果您使用加密,请记住,该工具会为此提取单一的 To: 地址。只有当其他收件人拥有 To: 收件人的私钥时,才能解码邮件正文。如果您只是使用次要收件人作为发送记录,例如,那可能也是可以的。

签好、封好、送达...I’m yours

这是我们关于如何通过SparkPost签署、加密和发送S/MIME消息的快速概述。快速提醒:演示项目在Github上这里,我已尝试让安装和使用变得简单。

额外功能:使用“mimeshow”显示MIME部分

RFC822 MIME多部分文件的内部结构对人类来说非常复杂。该项目包括一个名为mimeshow的独立工具,以让这一过程更简单。




这可以处理你拥有的任何电子邮件文件(不仅仅是S/MIME文件)并显示其内部结构。以下是一个示例:

./mimeshow.py testcases/img_and_attachment.eml




你将看到:

发给 Bob <bob.lumreeker@gmail.com>

来自 Steve <steve@thetucks.com>

主题 Testing attachments etc

MIME-Version 1.0

内容类型 multipart/mixed; boundary="------------7D48652042860D0098C65210"

内容语言 en-GB

 内容类型 multipart/alternative; boundary="------------58C0BF87598336550D70EB95"

   内容类型 text/plain; charset=utf-8; format=flowed

   内容传输编码 7bit

   内容传输编码 quoted-printable

   内容类型 text/html; charset="utf-8"

 内容类型 application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf"

 内容传输编码 base64

 内容显示形式 attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"



你还可以用作过滤器,以提供sparkpostSMIME输出的人类可读摘要:

./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py




你将看到:

发给 Bob <bob.lumreeker@gmail.com>

来自 Steve <steve@thetucks.com>

主题 Here is our declaration

内容语言 en-GB

MIME-Version 1.0

内容类型 application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m

内容传输编码 base64

内容显示形式 attachment; filename=smime.p7m



最后…

总结一下——我们安装了一些简单的命令行工具用于签署和加密邮件(Github 仓库在这里,附详细的安装说明)。




我们获取了用于签署的发件人钥匙/证书,并通过 SparkPost 发送了一封签名邮件。我们获取了用于加密的收件人证书,然后通过 SparkPost 发送了一封签名且加密的邮件。




最后,我们尝试了方便的独立工具“mimeshow”来查看邮件文件的内部结构。


到此为止!再见!

加入我们的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的隐私声明以获取有关数据处理的详细信息。