← RFC Reference

TLS和电子邮件安全

Email Concepts Encyclopedia Published March 2026
ELI5: 想象一下发送明信片与密封信封的区别。没有TLS时,电子邮件就像明信片——任何处理它的人都能读到。TLS是信封。STARTTLS就像问邮局"你能把这个放进信封里吗?"——他们可能会说好,但坏人可能拦截这个问题并说"不,我们这儿不这样做"。MTA-STS和DANE是发布规则的方式,说明"这个邮局总是使用信封,永远不要相信说其他的人"。

TLS 如何保护传输中的电子邮件 — STARTTLS、隐式 TLS、MTA-STS、DANE、TLSRPT — 以及为什么机会性加密还不够。

问题:SMTP 生来就是未加密的

SMTP 在 1982 年设计(RFC 821)时是明文协议。每个命令、每个响应、每个报头、每个字节的消息内容都在网络上不加密传输。通过 AUTH 发送的密码实际上是在房间里大声喊出来的。

TLS(传输层安全)被添加到 SMTP 上以解决这个问题。但与 HTTPS 不同(其中 TLS 是强制的且普遍的),电子邮件 TLS 已经通过一系列不完美的妥协发展而来,这些问题今天仍在解决中。

STARTTLS:机会性加密

STARTTLS(RFC 3207)将现有的明文 SMTP 连接升级到 TLS。流程:

# 连接在端口 25 上以明文开始
220 mx.example.com ESMTP
EHLO sender.example.net
250-mx.example.com
250-STARTTLS
250 SIZE 26214400
STARTTLS
220 Ready to start TLS
# TLS 握手开始
# 客户端和服务器协商 TLS 版本、密码套件、交换证书
# 连接现已加密
EHLO sender.example.net
250-mx.example.com
250 SIZE 26214400

关于 STARTTLS 的要点:

STARTTLS 剥离攻击

因为 STARTTLS 以明文开始,中间人攻击者可以修改服务器的 EHLO 响应以删除 STARTTLS 公告。发送 MTA 认为服务器不支持 TLS 并以明文继续。然后攻击者可以读取和修改消息。

# 服务器实际发送的内容:
250-mx.example.com
250-STARTTLS
250 SIZE 26214400

# 攻击者修改为:
250-mx.example.com
250 SIZE 26214400
# STARTTLS 行已删除 — 发送者回退到明文

这不是理论上的攻击。已在野外观察到它,特别是在进行大规模监视的国家。机会性 STARTTLS 对主动攻击者提供不了保护 — 它只保护被动窃听。

隐式 TLS:从第一个字节开始加密

RFC 8314 建议为邮件提交(客户端到服务器)使用隐式 TLS。连接从第一个字节开始就是 TLS,而不是从明文开始并升级。

RFC 8314 明确声明没有 TLS 的明文 SMTP 提交在端口 587 上已过时,隐式 TLS 在端口 465 上是首选的提交路径。实际上,端口 587 带 STARTTLS 仍被广泛部署,但方向很明确:隐式 TLS 是未来。

但是,隐式 TLS 只适用于提交路径(您的客户端到您的服务器)。端口 25 上的服务器到服务器传递仍然使用 STARTTLS,因为没有通用部署的机制让服务器预先知道收件人的 MX 支持隐式 TLS。这就是 MTA-STS 和 DANE 的用途。

MTA-STS:基于策略的 TLS 强制

MTA-STS(RFC 8461)通过允许域发布策略来解决 STARTTLS 剥离问题,该策略说"向我的 MX 服务器传递邮件时始终需要 TLS"。策略通过 HTTPS(而非 DNS)发布,这通过网络 PKI 提供了自己的身份验证。

MTA-STS 如何工作

  1. 域发布 DNS TXT 记录表示存在 MTA-STS 策略:
_mta-sts.example.com. IN TXT "v=STSv1; id=20260311"
  1. 发送 MTA 通过 HTTPS 从知名 URL 获取策略:
https://mta-sts.example.com/.well-known/mta-sts.txt
  1. 策略文件指定模式和有效的 MX 主机名:
version: STSv1 mode: enforce mx: mx1.example.com mx: mx2.example.com max_age: 604800
  1. 发送 MTA 缓存策略(max_age 秒)并在所有未来连接上强制执行。它将:
    • 要求端口 25 上的 STARTTLS(永不回退到明文)
    • 根据 MX 主机名验证服务器的 TLS 证书
    • 仅向策略中列出的 MX 主机名传递

MTA-STS 模式:

MTA-STS 具有与网络相同的信任模型:它依赖于证书颁发机构。如果 CA 被破坏,攻击者可能会伪造您的 MX 的证书。DANE 提供了一种基于 DNSSEC 的替代信任模型。

DANE:基于 DNS 的证书验证

DANE(RFC 7672)使用 DNSSEC 签名的 TLSA 记录将 TLS 证书(或其公钥)直接与 MX 主机名关联。这消除了对证书颁发机构的依赖。

; mx1.example.com 在端口 25 上的 TLSA 记录 _25._tcp.mx1.example.com. IN TLSA 3 1 1 a]b2c3d4e5f6...

TLSA 记录字段:

DANE 如何为电子邮件工作

  1. 发送 MTA 解析 MX 记录并获取 mx1.example.com。
  2. 它查询 _25._tcp.mx1.example.com 处的 TLSA 记录。
  3. 如果存在 DNSSEC 验证的 TLSA 记录,MTA 知道:
    • TLS 是强制的(不回退到明文)。
    • 服务器的证书必须与 TLSA 记录匹配。
  4. MTA 连接,执行 STARTTLS,并针对 TLSA 记录而不是(或除了)CA 系统验证服务器的证书。

DANE 的优势:它不依赖于证书颁发机构。其劣势:它需要 DNSSEC,许多域未部署它。没有 DNSSEC,TLSA 记录不可信(可以操纵 DNS 的攻击者也可以操纵 TLSA 记录)。

DANE 与 MTA-STS

MTA-STS DANE
信任模型 网络 PKI(证书颁发机构) DNSSEC
需要 HTTPS 托管 + DNS TXT 记录 域上的 DNSSEC
采用 更易部署;不需要 DNSSEC 需要 DNSSEC;更难部署
漏洞 被破坏的 CA 可以伪造证书 被破坏的 DNSSEC 可以伪造 TLSA 记录
首次接触 首次策略获取时易受攻击(TOFU) 首次连接时安全(如果 DNSSEC 有效)
发送者支持 Gmail、Outlook、Yahoo、大多数主要提供商 Postfix、Exim;大提供商中支持有限

两种机制可以共存。域可以发布 MTA-STS 和 DANE 策略。支持 DANE 的发送者使用它;不支持的可以回退到 MTA-STS。

TLSRPT:TLS 报告

SMTP TLS 报告(RFC 8460)让域从发送服务器接收有关 TLS 连接失败的报告。它是 TLS 等效的 DMARC 汇总报告。

_smtp._tls.example.com. IN TXT "v=TLSRPTv1; rua=mailto:tls-reports@example.com"

支持 TLSRPT 的发送 MTA 将发送详细以下内容的日常 JSON 报告:

TLSRPT 在 MTA-STS 部署期间必不可少。在 MTA-STS 策略中以 mode: testing 开始并监视 TLSRPT 报告。当您看到零个(或可接受的)失败时,转到 mode: enforce。

证书管理

TLS 需要证书,证书管理是电子邮件安全中最常见的操作失败点之一。

邮件服务器的证书

证书错误及其影响

错误 没有 MTA-STS/DANE 有 MTA-STS/DANE
证书过期 大多数发送者忽略它并无论如何都传递 传递失败;消息延迟
错误的主机名 大多数发送者忽略它 传递失败
自签名证书 大多数发送者接受它 传递失败(MTA-STS);可能通过(DANE,如果 TLSA 匹配)
已撤销的证书 很少检查 取决于实现

这个表揭示了机会性 TLS 的核心问题:没有 MTA-STS 或 DANE,大多数证书错误被无声地忽略。连接是加密的,但未认证 — 您可能正在将消息加密到攻击者的服务器。

电子邮件加密的现状

电子邮件加密存在于两个级别,经常被混淆:

传输加密(TLS)

TLS 加密服务器之间的连接。它在消息在任何两点之间传输时防止窃听。消息到达目标服务器后,被解密并以明文存储(通常)。TLS 保护传输,而不是消息。

传输加密是逐跳的:消息在您的服务器和下一个服务器之间加密,然后解密,然后为下一跳重新加密。每个中间服务器都可以访问明文消息。

端到端加密(S/MIME、PGP)

端到端加密(RFC 8551 中的 S/MIME,或 PGP/OpenPGP)加密消息内容本身,因此只有具有正确私钥的预期收件人可以解密它。消息在服务器上保持加密状态并在每个传输跳期间加密。

端到端加密在电子邮件中的采用仍然极其低。原因是实际的:

对于大多数电子邮件,传输级 TLS 是实际的加密层。端到端加密仍然是利基,在操作负担合理的高安全环境中使用。

需要 TLS(RFC 8689)

RFC 8689 定义了一个按消息机制来需要 TLS。发送者向各个消息添加 REQUIRETLS SMTP 扩展:

MAIL FROM:<alice@example.com> REQUIRETLS
250 OK

当设置 REQUIRETLS 时:

REQUIRETLS 是消息级别的 — 您可以为敏感消息使用它,而无需为所有邮件需要 TLS。但是,采用仍然有限。大多数服务器还不支持它。

实用部署指南

这是为您的域的电子邮件部署 TLS 的推荐序列:

步骤 1:确保您的 MX 服务器上的 TLS

从公共 CA 获取每个 MX 主机名的有效证书。自动化更新。测试来自外部发送者的 STARTTLS 是否正确工作。

步骤 2:部署 TLSRPT

发布 _smtp._tls TXT 记录以接收 TLS 失败报告。在强制任何东西之前开始监视。

步骤 3:在测试模式下部署 MTA-STS

发布 DNS TXT 记录和带有 mode: testing 的 HTTPS 策略文件。监视 TLSRPT 报告中的失败。调查并修复任何问题。

步骤 4:将 MTA-STS 移动到强制模式

一旦 TLSRPT 报告显示清晰的结果,将模式更改为 enforce。增加 DNS TXT 记录中的 id 以表示策略更改。

步骤 5:考虑 DANE(如果您使用 DNSSEC)

如果您的域是 DNSSEC 签名的,为您的 MX 服务器发布 TLSA 记录。这提供了独立于 CA 系统的额外层证书固定。

可能出错的地方

过期的证书导致传递失败

您的 MX 服务器的证书过期了。没有 MTA-STS,大多数发送者忽略错误并无论如何都传递(不安全但可工作)。有了 MTA-STS 在强制模式中,验证证书的发送者将延迟传递。消息在发送方排队。如果您在发送者的重试窗口内(通常 4-5 天)不修复它,消息会反弹。修复:使用 Let's Encrypt/ACME 自动化证书更新。

MX 更改后的 MTA-STS 策略不匹配

您添加了新的 MX 服务器 (mx3.example.com),但忘记将其添加到 MTA-STS 策略文件。已缓存旧策略的发送者拒绝与新 MX 的连接,因为它不在策略的允许列表中。修复:在添加新 MX 记录之前始终更新 MTA-STS 策略文件,并增加策略 DNS 中的 id。

未检测到的 STARTTLS 剥离

没有 MTA-STS 或 DANE,攻击者从服务器的 EHLO 响应中剥离 STARTTLS。消息以明文传递。发送者和接收者都不知道。修复:部署 MTA-STS 使 TLS 剥离可检测和可防止。

DANE TLSA 记录变陈旧

您轮转 TLS 证书但忘记更新 DNS 中的 TLSA 记录。验证 DANE 的发送者看到不匹配并拒绝传递。修复:始终在部署新证书之前更新 TLSA 记录。使用协调证书部署与 DNS 更新的自动化。

关键要点

延伸阅读

Related RFCs