跳到主要内容
ecdsa.com

S/MIME vs OpenPGP:端到端邮件签名与加密对比

两者都能对邮件做端到端的签名和加密。S/MIME 依赖 CA 签发的证书,内置于企业邮件客户端;OpenPGP 依赖用户自行核验的密钥,内置它的工具则少一些。
对比对象S/MIMEOpenPGP

在 S/MIME 和 OpenPGP 之间做选择,就是在端到端邮件安全的两个标准之间做选择。S/MIME(RFC 8551)用加密消息语法(CMS)封装邮件,并用证书颁发机构签发的 X.509 证书标识用户身份。OpenPGP(RFC 9580)使用自己的数据包格式,密钥由所有者自行生成和发布,信任则通过核对指纹、其他用户的签名或接收者的域名来建立。

概览

S/MIMEOpenPGP
规范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 版本的 GmailThunderbird(自 78 版起)、Proton Mail;其他客户端需借助插件
2026年允许的算法《S/MIME 基线要求》允许 RSA 2048+、ECDSA P-256/384/521、EdDSA、ML-DSA 和 ML-KEMEd25519、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 都在临时目录中创建,运行结束后删除。

分别用 OpenPGP 和 S/MIME(CMS)签名
#!/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)的客户端;否则主题会以明文传输。

迁移说明

  1. 新的 S/MIME 部署:申请严格(Strict)或多用途(Multipurpose)证书,把邮件地址写入主题备用名称(SAN),并把签名密钥与加密密钥分开,只托管后者。
  2. 现有 S/MIME 用户:按旧版配置文件签发的证书会在续期时被替换;在旧证书过期之前,确认合作伙伴的客户端能接受新的配置文件。
  3. OpenPGP 密钥:生成 Ed25519 和 X25519 密钥(如果所有通信对象的软件都支持,也可以生成第 6 版密钥),把有效期设为一到两年并按期延长,离线保存一份吊销证书,并通过 WKD 发布。
  4. 归档:只要还需要阅读旧邮件,就保留旧的解密密钥或证书;只有重新加密归档,才能让它们退役。
  5. 后量子规划:加密邮件面临“先收集后解密”攻击的风险。ML-KEM 已有用于 CMS 的规范(RFC 9936),与 X25519 组合后也有用于 OpenPGP 的规范(RFC 9980);先规划加密密钥,再规划签名。OpenPGP 查看器和 S/MIME 签名验证工具可以显示密钥、证书或邮件使用了哪些算法。

参考资料

全部对比