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 可能会就我们的产品和服务与您联系。

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

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

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

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

Newsletter

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

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

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

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

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

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

R

Reach

G

Grow

M

Manage

A

Automate

Newsletter

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

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

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