
在第一部分中,我们快速介绍了 S/MIME,查看了在一系列邮件客户端中对我们消息流的签名和加密。S/MIME 消息可以被签名(提供发件人身份的证明)、加密(保持消息内容的秘密)或两者兼而有之。
Business in a box.
探索我们的解决方案。
与我们的销售团队交谈

在这个部分中,我们将:
安装一些简单的命令行工具来签名和加密电子邮件
获取用于签名的发送者密钥/证书
通过SparkPost发送签名消息,并查看接收到的消息
可选地,获取用于加密的接收者证书
通过SparkPost发送签名和加密的消息,并查看接收到的消息
尝试使用一个方便的独立工具“mimeshow”来查看电子邮件文件的内部结构。
好的——让我们开始吧!
2. 获取您的发件人密钥/证书以进行签名
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”来查看邮件文件的内部结构。
到此为止!再见!