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 消息可以被签名(提供发件人身份的证明)、加密(保持消息内容的秘密)或两者兼而有之。

Diagram illustrating email security layers showing the relationship between S/MIME signing, S/MIME encryption, and TLS connections in the email delivery process from message source through email server to recipient.

在本期中,我们将:

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

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

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

  • (可选)获取您的收件人证书以进行加密

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

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

好的——让我们开始吧!

1. 安装工具

演示工具在Github 这里,包含完整的安装说明。您可能会注意到“build passing”标志 – Travispytest 会自动检查构建状态。请注意,这些工具并未由SparkPost正式支持,但我已尽力使它们健壮且易于使用。

如果您对Python和pip有一些了解,安装应该会感觉很熟悉。Pipfile 会自动为您处理外部依赖项。一旦完成,您可以通过运行

./sparkpostSMIME.py -h

来检查是否已安装所有内容。您应该会看到友好的帮助文本。接下来,我们需要…

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

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

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

如果您只是进行测试,您可以使用 Linux 上的命令行工具 openssl 为某个电子邮件地址制作“自签名”证书和密钥,按照类似这种方式的程序操作。在该过程结束时,您将获得一个 smime.p12 文件。将此文件重命名为与您的发送身份匹配的名字,包括 @ 符号,例如,alice@example.com.p12。

或者

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

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

Firefox browser settings page showing certificate management options under the Privacy & Security section, with controls for how the browser handles personal certificate requests.


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

Certificate Manager window showing a list of software security device certificates from COMODO CA Limited, with details including certificate names and serial numbers


提供密码以保护 .p12 文件:

Certificate backup password entry dialog with password fields and strength meter


生成单独的公用 (.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,MINGW64 之类的 openssl 实现可用,它内置于Git 命令行工具,但我发现它往往只是锁定。您可能会发现,在 Linux 上完成这项工作更简单和快捷,然后将文件复制过来。那些 Windows 的 Git 工具配有一个很好的 ssh 客户端,您可以用来登录到 Linux 机器上,比如Amazon EC2实例。


2.1 签署消息

在 tests 目录中已经有一个用于 alice@example.com 的虚拟密钥/证书和电子邮件源文件,因此即使在您拥有自己的密钥之前也可以获得一些输出。只需输入以下内容:

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

然后您将获得:

To: Bob <bob@example.com> 
From: Alice <alice@example.com> 
Subject: A message 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 : :

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

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

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

如果您只是进行测试,您可以使用 Linux 上的命令行工具 openssl 为某个电子邮件地址制作“自签名”证书和密钥,按照类似这种方式的程序操作。在该过程结束时,您将获得一个 smime.p12 文件。将此文件重命名为与您的发送身份匹配的名字,包括 @ 符号,例如,alice@example.com.p12。

或者

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

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

Firefox browser settings page showing certificate management options under the Privacy & Security section, with controls for how the browser handles personal certificate requests.


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

Certificate Manager window showing a list of software security device certificates from COMODO CA Limited, with details including certificate names and serial numbers


提供密码以保护 .p12 文件:

Certificate backup password entry dialog with password fields and strength meter


生成单独的公用 (.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,MINGW64 之类的 openssl 实现可用,它内置于Git 命令行工具,但我发现它往往只是锁定。您可能会发现,在 Linux 上完成这项工作更简单和快捷,然后将文件复制过来。那些 Windows 的 Git 工具配有一个很好的 ssh 客户端,您可以用来登录到 Linux 机器上,比如Amazon EC2实例。


2.1 签署消息

在 tests 目录中已经有一个用于 alice@example.com 的虚拟密钥/证书和电子邮件源文件,因此即使在您拥有自己的密钥之前也可以获得一些输出。只需输入以下内容:

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

然后您将获得:

To: Bob <bob@example.com> 
From: Alice <alice@example.com> 
Subject: A message 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 : :

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

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

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

如果您只是进行测试,您可以使用 Linux 上的命令行工具 openssl 为某个电子邮件地址制作“自签名”证书和密钥,按照类似这种方式的程序操作。在该过程结束时,您将获得一个 smime.p12 文件。将此文件重命名为与您的发送身份匹配的名字,包括 @ 符号,例如,alice@example.com.p12。

或者

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

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

Firefox browser settings page showing certificate management options under the Privacy & Security section, with controls for how the browser handles personal certificate requests.


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

Certificate Manager window showing a list of software security device certificates from COMODO CA Limited, with details including certificate names and serial numbers


提供密码以保护 .p12 文件:

Certificate backup password entry dialog with password fields and strength meter


生成单独的公用 (.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,MINGW64 之类的 openssl 实现可用,它内置于Git 命令行工具,但我发现它往往只是锁定。您可能会发现,在 Linux 上完成这项工作更简单和快捷,然后将文件复制过来。那些 Windows 的 Git 工具配有一个很好的 ssh 客户端,您可以用来登录到 Linux 机器上,比如Amazon EC2实例。


2.1 签署消息

在 tests 目录中已经有一个用于 alice@example.com 的虚拟密钥/证书和电子邮件源文件,因此即使在您拥有自己的密钥之前也可以获得一些输出。只需输入以下内容:

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

然后您将获得:

To: Bob <bob@example.com> 
From: Alice <alice@example.com> 
Subject: A message 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 : :

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

3. 通过 SparkPost 发送签名消息

现在让我们使用一个真实的发送域,按照SparkPost New User Guide进行设置。我们在当前目录下有发件人证书和密钥文件:

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: Here is our declaration 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

您将看到:

Opened connection to https://api.sparkpost.com/api/v1 发送tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob  <bob.lumreeker@gmail.com> OK - in 1.15 seconds

大约一秒钟后,电子邮件到达Bob的Inbox。Thunderbird显示信封上有一个红点,表示有效的发件人签名。

Thunderbird email inbox showing an email with a subject 'Here is our declaration'

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

4. 加密消息

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

袋属性  友好名称: s COMODO CA Limited ID #2   本地密钥ID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 主题=/emailAddress=bob.lumreeker@gmail.com 发证者=/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: A message 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 文件 用于我打算的接收者——与我文件中的发件人地址匹配。

这是发送命令:

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

我看到:

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

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

Thunderbird email view with signature and encryption icons

您还可以轻松发送包含链接和图像的复杂 HTML 格式电子邮件,如第一部分所示。某些客户端如 Thunderbird 请求许可才能在加密的 S/MIME 消息中显示外部链接和图像,但仅签名的消息在包括 Thunderbird 和 Gmail 的客户端中表现良好:

Avocado marketing email with guacamole in a blue bowl and product order sectionsGmail interface showing an HTML email with guacamole image and Avocado marketing content

注意下拉菜单显示“已验证的电子邮件地址”。

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

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

您可以包含其他收件人使用 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

你会看到:

To Bob <bob.lumreeker@gmail.com>
From Steve <steve@thetucks.com> 
Subject Testing attachments etc 
MIME-Version 1.0
Content-Type multipart/mixed; boundary="------------7D48652042860D0098C65210"
Content-Language en-GB
Content-Type multipart/alternative; boundary="------------58C0BF87598336550D70EB95" 
Content-Type text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding 7bit
Content-Transfer-Encoding quoted-printable 
Content-Type text/html; charset="utf-8"
Content-Type application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf" 
Content-Transfer-Encoding base64
Content-Disposition attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"

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

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


你会看到:

To Bob <bob.lumreeker@gmail.com>  
From Steve <steve@thetucks.com>
Subject Here is our declaration 
Content-Language en-GB
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

最后…

回顾一下——我们已经安装了一些简单的命令行工具用于签署和加密电子邮件(Github仓库在这里,附有安装说明)。

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

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

现在就是这样!很快再见!

让我们为您联系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 的最新动态。