← RFC Reference

RFC 5751:S/MIME 3.2 消息规范

Standards Track Content Security Published March 2026
ELI5: TLS 在传输过程中加密电子邮件——就像一辆装甲车在邮局之间运送你的信件。但在每个邮局,信件都会被卸下来并且可读。S/MIME 加密信件本身。只有持有正确密钥的预期收件人才能打开并阅读它。即使中间的邮件服务器也无法窥视。它还允许你以数字方式"盖章"你的信件,以便收件人可以证明它来自你且未被篡改。

存在的原因

传输层安全性(TLS、STARTTLS)保护邮件在各跳之间的传输,但有局限性:

S/MIME 提供端到端加密(仅收件人可解密)和数字签名(收件人可验证发件人身份和内容未被修改)。它使用与保护 HTTPS 相同的 PKI 中的 X.509 证书。

工作原理

两种操作

S/MIME 使用 CMS(密码消息语法)将标准 MIME 消息包装在密码信封中:

操作 功能 MIME 类型
签名 证明发件人身份和消息完整性 multipart/signed 或 application/pkcs7-mime(不透明)
加密 加密内容使仅收件人可读 application/pkcs7-mime(enveloped-data)

您可以仅签名、仅加密或签名后加密(最常见的组合)。

签名消息

发件人使用其私钥创建邮件内容的数字签名。存在两种格式:

-- 明文签名消息结构 --
Content-Type: multipart/signed;
  protocol="application/pkcs7-signature";
  micalg=sha-256; boundary="----sig"

------sig
Content-Type: text/plain

这是原始消息内容。
任何电子邮件客户端都可以读取它。

------sig
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: base64

MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBgl...
(base64 编码的 CMS SignedData)
------sig--

加密消息

发件人使用收件人的公钥加密(来自其 X.509 证书)。仅收件人对应的私钥可解密:

-- 加密消息结构 --
Content-Type: application/pkcs7-mime;
  smime-type=enveloped-data;
  name=smime.p7m
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smime.p7m

MIAGCSqGSIb3DQEHA6CAMIA...
(base64 编码的 CMS EnvelopedData)

实际上,S/MIME 使用混合加密:随机对称密钥(如 AES-128-CBC)加密消息,收件人的 RSA/EC 公钥加密该对称密钥。

关键技术细节

证书要求

S/MIME 依赖由证书颁发机构 (CA) 颁发的 X.509 证书。证书必须:

这是 S/MIME 采用的最大实际障碍:每个发件人都需要一个证书,每个收件人都需要发件人的公开证书来验证签名或发送加密回复。

算法要求(S/MIME 3.2)

用途 必须支持 应该支持
签名(摘要) SHA-256 SHA-384、SHA-512
签名(密钥) RSA DSA、ECDSA
加密(内容) AES-128-CBC AES-192-CBC、AES-256-CBC
密钥传输 RSA ECDH

SHA-1 和 3DES 仍然因向后兼容性而被引用,但被认为是较弱的。S/MIME 4.0 显著更新了这些要求。

证书发现

对于加密,发件人需要收件人的证书。常见的发现方法:

常见错误

可递送性影响

Related RFCs