在 S/MIME 和 OpenPGP 之间做选择,就是在端到端邮件安全的两个标准之间做选择。S/MIME(RFC 8551)用加密消息语法(CMS)封装邮件,并用证书颁发机构签发的 X.509 证书标识用户身份。OpenPGP(RFC 9580)使用自己的数据包格式,密钥由所有者自行生成和发布,信任则通过核对指纹、其他用户的签名或接收者的域名来建立。
概览
| S/MIME | OpenPGP | |
|---|---|---|
| 规范 | RFC 8551(S/MIME 4.0)、CMS(RFC 5652) | RFC 9580(2024年);后量子:RFC 9980(2026年6月);GnuPG 遵循 LibrePGP |
| 密钥容器 | CA 签发的 X.509 证书 | OpenPGP 密钥,自签名,可选由他人认证 |
| 信任决策 | 操作系统和邮件客户端根证书库中的 CA 层级 | 核对指纹、信任网、首次使用时信任,或域名的 Web 密钥目录(WKD) |
| 身份核验 | CA 验证邮箱(并按证书类型验证组织或个人) | 默认没有;部分目录会验证邮件地址 |
| 密钥发现 | 随签名邮件一起发送;企业目录(GAL、LDAP) | Web 密钥目录、密钥服务器、Autocrypt 头部、手动交换 |
| 分离签名大小(实测见下文) | 含签名者证书 907 字节,不含 446 字节 | 147 字节(Ed25519) |
| 有效期 | 公开信任的证书最长 825 天 | 由所有者决定,可延长 |
| 吊销 | CA 发布的 CRL 或 OCSP | 密钥所有者发布的吊销签名 |
| 内置客户端支持 | Outlook、Apple Mail、iOS 邮件;部分 Workspace 版本的 Gmail | Thunderbird(自 78 版起)、Proton Mail;其他客户端需借助插件 |
| 2026年允许的算法 | 《S/MIME 基线要求》允许 RSA 2048+、ECDSA P-256/384/521、EdDSA、ML-DSA 和 ML-KEM | Ed25519、X25519、Ed448、X448、RSA;复合 ML-DSA+Ed25519 和 ML-KEM+X25519(RFC 9980) |
| 内容加密 | 必须支持 AES-GCM(RFC 8551),AES-CBC 用于兼容 | RFC 9580 的 SEIPD v2 中使用 AEAD(必须支持 OCB) |
签名是什么样子
下面的脚本用 GnuPG 2.5.21 和 OpenSSL 3.6.5 以两种方式对同一条短消息签名,然后逐一验证。密钥和一次性 CA 都在临时目录中创建,运行结束后删除。
#!/bin/sh
dir=$(mktemp -d)
cd "$dir" || exit 1
export GNUPGHOME="$dir/gnupg"
mkdir -m 700 "$GNUPGHOME"
printf 'Quarterly report attached.\n' > msg.txt
echo "== OpenPGP (GnuPG)"
gpg --batch --quiet --passphrase '' --quick-gen-key "Alice <alice@example.org>" ed25519 sign 1d
gpg --batch --quiet --detach-sign msg.txt
gpg --batch --verify msg.txt.sig msg.txt 2>&1 | grep -E "using|Good"
echo "signature bytes: $(wc -c < msg.txt.sig)"
gpgconf --kill gpg-agent
echo "== S/MIME (OpenSSL CMS)"
EC="-newkey ec -pkeyopt ec_paramgen_curve:P-256 -noenc"
openssl req -x509 $EC -keyout ca.key -out ca.pem -days 30 -subj "/CN=Example Mail CA" \
-addext "keyUsage=critical,keyCertSign" 2>/dev/null
openssl req -x509 $EC -CA ca.pem -CAkey ca.key -keyout alice.key -out alice.pem -days 30 \
-subj "/CN=Alice" -addext "subjectAltName=email:alice@example.org" \
-addext "keyUsage=critical,digitalSignature" \
-addext "extendedKeyUsage=emailProtection" 2>/dev/null
openssl cms -sign -binary -in msg.txt -signer alice.pem -inkey alice.key -outform DER -out msg.p7s
openssl cms -verify -binary -in msg.p7s -inform DER -content msg.txt -CAfile ca.pem -out /dev/null
echo "signature bytes: $(wc -c < msg.p7s)"
openssl cms -sign -binary -nocerts -in msg.txt -signer alice.pem -inkey alice.key -outform DER -out bare.p7s
echo "without the embedded certificate: $(wc -c < bare.p7s)"
cd / && rm -rf "$dir"
== OpenPGP (GnuPG)
gpg: using EDDSA key 57AE27428681EABC417A15B7DDA5B1FF5FAE8694
gpg: Good signature from "Alice <alice@example.org>" [ultimate]
signature bytes: 147
== S/MIME (OpenSSL CMS)
CMS Verification successful
signature bytes: 907
without the embedded certificate: 446
大小差异源于结构。CMS 签名通常携带签名者的证书,因此任何接收者都能对照受信任的根证书验证签名,并留存该证书用于加密回复;即使不带证书,签名时间、内容类型等签名属性也会让结构更大。OpenPGP 的分离签名通过指纹指明密钥,因此接收者必须已经拥有该密钥,或者去获取它。40 个字符的指纹表明 GnuPG 创建的是第 4 版密钥;RFC 9580 的第 6 版密钥使用 64 个字符的 SHA-256 指纹。
两者如何决定信任谁
S/MIME 把这个决定交给证书颁发机构。自2023年9月1日起,公开信任的 S/MIME 证书须遵循 CA/Browser Forum 的《S/MIME 基线要求》:CA 必须验证申请者对每个邮件地址的控制权;证书类型从邮箱验证型到个人验证型不等;自2025年7月15日起,不得再按宽松的“旧版”(Legacy)证书配置文件签发证书;订户证书的有效期最长 825 天。企业也可以运行自己的 CA,并通过设备管理部署证书,大多数大规模 S/MIME 部署就是这样做的。
OpenPGP 把决定权留给用户。最初的信任网由用户相互为对方的密钥签名,却始终没能推广到小型社区之外;而对于未经验证的身份,接受任意上传的公共密钥服务器已经不再可用。如今的做法是:通过带外渠道核对指纹,在首次使用时接受密钥,或者通过 Web 密钥目录查找,即由接收者自己的域名通过 HTTPS 提供密钥。keys.openpgp.org 只有在验证邮件地址之后才会发布身份。
客户端、兼容性与 OpenPGP 的分裂
S/MIME 的优势在于集成:安装证书后,Outlook、Apple Mail 和 iOS 邮件就能原生签名和加密;Gmail 在部分 Google Workspace 版本中提供托管式 S/MIME。OpenPGP 原生内置于 Thunderbird 和 Proton Mail,在其他客户端中可通过插件使用。
OpenPGP 还存在标准分裂。IETF 于2024年7月发布了 RFC 9580,引入第 6 版密钥、强制支持的 AEAD 加密和 Argon2 密码短语保护;又于2026年6月发布了针对后量子密钥的 RFC 9980。GnuPG 则实现了 LibrePGP,其第 5 版密钥和 OCB 数据包格式与 RFC 9580 不同。使用传统加密数据包的第 4 版密钥在所有实现之间都能互通;对于密钥声明支持 OCB 数据包的接收者,GnuPG 可能会改用这种数据包;而第 6 版密钥等 RFC 9580 特性,需要先用通信对象的软件测试。
两种标准都受到 EFAIL(2018年)的影响:精心构造的密文会让邮件客户端通过 HTML 泄露解密后的文本。长期的修复办法是认证加密(S/MIME 4.0 中的 AES-GCM,OpenPGP 中的修改检测码以及现在的 AEAD),以及拒绝显示未通过认证的明文的客户端。
如何选择
- 受管设备上的公司邮件:S/MIME,证书由 MDM 部署;托管加密密钥,切勿托管签名密钥。
- 已经持有 S/MIME 证书的外部合作伙伴(公共部门、银行、医疗机构):S/MIME。
- 个人、记者、开源项目维护者:OpenPGP,通过 WKD 或 keys.openpgp.org 发布密钥。
- 加密的是文件、备份或机密,而不是邮件:两者都不适用;使用 age(参见 age 与 GPG 对比)。
- 为软件发布版本和提交签名:OpenPGP 仍然可用,但 Sigstore 和 SSH 签名往往更简单(参见 Sigstore 与 GPG 签名对比)。
- 保护邮件主题:无论选择哪种,都要使用实现了邮件头保护(RFC 9788)的客户端;否则主题会以明文传输。
迁移说明
- 新的 S/MIME 部署:申请严格(Strict)或多用途(Multipurpose)证书,把邮件地址写入主题备用名称(SAN),并把签名密钥与加密密钥分开,只托管后者。
- 现有 S/MIME 用户:按旧版配置文件签发的证书会在续期时被替换;在旧证书过期之前,确认合作伙伴的客户端能接受新的配置文件。
- OpenPGP 密钥:生成 Ed25519 和 X25519 密钥(如果所有通信对象的软件都支持,也可以生成第 6 版密钥),把有效期设为一到两年并按期延长,离线保存一份吊销证书,并通过 WKD 发布。
- 归档:只要还需要阅读旧邮件,就保留旧的解密密钥或证书;只有重新加密归档,才能让它们退役。
- 后量子规划:加密邮件面临“先收集后解密”攻击的风险。ML-KEM 已有用于 CMS 的规范(RFC 9936),与 X25519 组合后也有用于 OpenPGP 的规范(RFC 9980);先规划加密密钥,再规划签名。OpenPGP 查看器和 S/MIME 签名验证工具可以显示密钥、证书或邮件使用了哪些算法。