邮件加密
我对邮件签名和加密的兴趣源自 Thunderbird,因为在使用时发现有个很显眼的“端对端加密”功能,支持 OpenPGP 和 S/MIME 两种方式。
OpenPGP(Pretty Good Privacy,PGP 的开放标准)和 S/MIME(Secure/Multipurpose Internet Mail Extensions)是两种广泛用于电子邮件签名与加密的标准协议。它们的主要目标是提供邮件的机密性、完整性和身份验证,但在实现方式和应用场景上有所不同。
其中,OpenPGP 由 PGP(Pretty Good Privacy)发展而来,并标准化为 RFC 4880。它采用 Web of Trust(信任网络)模型,用户可以相互签署公钥以建立信任关系。邮件加密方式结合了非对称加密(如 RSA、ECC)和对称加密(如 AES),主要依赖用户自行管理密钥,无需中央认证机构。虽然有类似 keys.openpgp.org 这样的公钥服务器可以发布公钥,但在实际使用中,OpenPGP 相较于 S/MIME 并不那么方便。
S/MIME 标准化为 RFC 8551,内置于企业级邮件系统(如 Outlook、Apple Mail)。它依赖 PKI(公钥基础设施),使用 CA(证书颁发机构)颁发的 X.509 证书进行身份验证,从而确保邮件来源的真实性和完整性。实际体验下来,它的使用方式类似于 SSL 证书。感谢 ZeroSSL.com 和 Let’s Encrypt 等公司与组织,个人网站如今可以使用一系列开源工具获取免费且可自动续签的 SSL 证书。同样,在 S/MIME 领域,也有一年期免费证书可以申请,门槛低了不少。
在后文的实践环节,以 IOS 平台的“邮件”APP 和 Windows/MacOS 平台的 Thunderbird 软件作为基础。
S/MIME 证书申请
这里选择的是 Actalis 提供的一年期免费 S/MIME 证书。申请流程非常简单:
- 进入 Actalis 官网,注册账户。
- 向下滚动页面,在 Mailbox Validated 选项下,会看到一个醒目的绿色“Request”按钮,点一下,按照提示操作即可。
- 输入需要申请证书的邮箱地址后,Actalis 会向该邮箱发送一封验证邮件。
- 邮件是意大利语和英语双语的,如果不熟悉意大利语,可以直接滚动到邮件下半部分,点击英文版的验证链接。
- 验证完成后,等待几分钟,Actalis 会再发送一封邮件,其中包含 p12 证书的密码,而证书本身可以在账户的 Customer Area / Dashboard 下载。
整个流程很快,基本无坑,适合需要免费 S/MIME 证书的用户。
签名/加密配置
原理简介
邮件加密不仅仅是拥有一个密钥那么简单,而是基于非对称加密技术,通过公钥和私钥的配合来实现安全通信。在理想的端对端加密模式下,双方首先需要互相发送带有公钥签名的邮件,以此交换公钥,为后续的加密通信建立信任。
邮件签名用于保证邮件的真实性和完整性。发送邮件时,你会使用自己的私钥对邮件内容进行签名,并将公钥附加在邮件的 S/MIME 证书或 PGP 公钥块中。对于 S/MIME,公钥通常嵌入到邮件的 MIME 头部(application/pkcs7-signature 或 smime.p7s 附件)中,邮件客户端(如 Outlook、Apple Mail、Thunderbird)会自动解析并存储该证书。收到邮件后,客户端会使用公钥验证签名的有效性,确认邮件内容未被篡改,且确实来自发件人。对于 PGP,公钥可能以内嵌的 PGP 公钥块(—–BEGIN PGP PUBLIC KEY BLOCK—–)形式出现在邮件正文中,或者作为 .asc 附件提供,收件人需要手动导入到 PGP 密钥管理器中。无论哪种方式,对方都需要发送一封带有签名的邮件,你获取并存储对方的公钥,以确保后续的加密通信能够顺利进行。
完成公钥交换后,发送邮件时,你可以使用收件人的公钥对邮件内容进行加密,使其只能由收件人解密和阅读。收到加密邮件时,你使用自己的私钥解密,从而确保通信的机密性。通过这一机制,邮件不仅能保证完整性和身份认证(签名),还能确保机密性(加密),实现安全的端对端通信。
iOS “邮件”App
首先,要将拿到的 p12 证书安装到设备上。使用 AirDrop 或 LocalSend 之类的工具将证书安全地发送到 iPhone,点击证书后,会提示“已下载描述文件”,根据提示在“设置” -> “通用” -> “VPN 与设备管理”中选择证书,点击“安装”后即可将证书安装在设备上。
这里有一个细节,对于导入的 p12 证书,iOS 首先会显示红色的“未经验证”,需要额外从 p12 证书中导出中间证书并安装,才能正确显示证书签名。根据我的理解,这是因为 iOS 预装的证书中信任了 Actalis 的根证书,但 p12 证书在 iPhone 中只识别了用户证书,未包含中间证书,导致证书链不完整。
使用以下命令导出中间证书:
openssl pkcs12 -in certificate_s_mime.p12 -cacerts -nokeys -out intermediate-cert.pem
按照相同方式导入并安装到 iPhone 上,即可将“未经验证”的 S/MIME 证书正确识别签名。
之后,在“设置” -> “邮件”中配置“邮件账户”,在“账户”里选择 Mailserver 对应的账户,进入“账户设置” -> “高级”,滚动到底部的 S/MIME 选项,启用签名功能。
Thunderbird
点击左下角的“设置”按钮,在“账户设置”中展开证书对应的邮箱,选择“端对端加密”,在 S/MIME 那一栏下方,点击“管理 S/MIME 证书”。
在“导入”选项中,按提示导入证书并输入私钥密码(邮件中提供的)。然后,在“个人数字签名证书”和“个人加密证书”中,选择刚才导入的证书。最后,在“发送消息时的默认设置”里,勾选“签名未加密消息”,这样每次发件时都会自动附上签名。
客户端支持情况
目前尝试了多个客户端,OpenPGP 的支持情况较不理想,因此不作详细阐述。
对于 S/MIME 证书,iOS 的“邮件”App 和 Thunderbird 具有良好的兼容性,能够完美支持邮件的加密和签名。
Gmail 网页版及 iOS App 支持显示邮件签名,但加解密功能可能需要 Workspace 订阅才能启用。
Outlook 网页版似乎不支持签名和加解密,客户端能够在新窗口显示签名,并能够显示邮件已加密(锁图标),但无法确认如何解密。Microsoft 文档显示企业版订阅支持相关功能。
邮件代发
根据之前的 Docker Mailserver 的配置和相关资料,在大部分云服务器厂商封锁 25 端口的情况下,使用邮件代发服务发件,这也是邮件加密最困难的一点。
我曾尝试过多种带有免费额度的邮件代发服务,但它们要么无法正确处理邮件签名(如 Postmark 和 Resend),导致签名被错误地显示为附件;要么因电子邮件追踪等功能篡改邮件内容(如 Brevo),使邮件被错误地标记为已被修改。
在经过了两整天的痛苦尝试后,我转向了免费企业邮箱,经过仔细搜索选择了 Zoho Mail 海外版(国内版没有免费计划,经典国区特不供),按照提示的配置说明设置了发件和验证的 DNS,但是不修改 MX 配置,而是沿用将邮件投递到 Mailserver,因为 Zoho Mail 的免费版本不支持 IMAP / POP / Active Sync,不能直接同步到邮件客户端。
在这一设计下,
- 发件 由自建 Mailserver 通过 Zoho 作为中继无修改地发送。
- 收件 存储在 Mailserver,可通过 IMAP 和 SMTP 完整支持邮件客户端访问。
- 邮件签名和加密 仍可在邮件客户端中无缝使用,无任何破坏。
还有一个推荐选项,虽然我没有亲自尝试过,那就是通过 iCloud+ 订阅托管域名邮箱。根据官网的说明,应该同样可以完美中继,但是这个功能实践下来也是环中国大陆特供,有条件的可以试试。
诸位也可以尝试下国内的企业邮箱,如网易、阿里云和腾讯的能不能这样通过 SMTP 代发,我估计也是同样可以的。但是都用上企业邮箱了,自建邮箱收件除了基于隐私考量外,也像是个费力不讨好的选项。
一些链接
- Actalis S/MIME 申请地址:https://www.actalis.com/s-mime-certificates
- Zoho 官网:https://www.zoho.com/mail/zohomail-pricing.html
- iCloud+ 订阅托管域名邮箱说明:https://support.apple.com/zh-cn/102540