← RFC Reference

RFC 3207 – SMTP STARTTLS 扩展

Proposed Standard Transport Security Obsoletes RFC 2487 Published March 2026
ELI5: 想象你在一个拥挤的房间里聊天。任何人都可以听到。STARTTLS就像在对话中途说"我们进一个私人房间吧"。你先以明文开始SMTP会话,然后双方在交换任何敏感内容之前同意切换到加密通信。之后,没有人能够窃听正在传输的电子邮件。

此 RFC 存在的原因

当 SMTP 在 1982 年设计时,加密不在考虑范围内。消息以明文形式在互联网上传输,任何可以访问网络路径的人都可以读取它们。随着互联网变得更加恶劣,传输中的电子邮件加密变得至关重要。

RFC 3207 定义了 SMTP 的 STARTTLS 扩展,允许将明文 SMTP 连接升级为加密的 TLS 连接。发布于 2002 年,它取代了 RFC 2487,并澄清了安全考虑和服务器行为。

STARTTLS 是在端口 25 上加密服务器到服务器(MTA 到 MTA)电子邮件流量的主要机制。对于客户端到服务器提交,RFC 8314 现在建议在端口 465 上使用隐式 TLS,但端口 587 上的 STARTTLS 仍然广泛使用。

工作原理

STARTTLS 作为 SMTP 扩展工作,在 EHLO 交换期间协商:

  1. 客户端以明文形式连接到端口 25(或 587)上的服务器。
  2. 客户端发送 EHLO。服务器以其功能响应,如果支持加密,则包括 250-STARTTLS。
  3. 客户端发送 STARTTLS。
  4. 服务器以 220 Ready to start TLS 响应。
  5. 双方执行 TLS 握手,建立加密通道。
  6. 客户端通过加密连接发送新的 EHLO。服务器的功能列表可能会更改(例如,AUTH 现在已公布)。
  7. SMTP 会话正常继续,但所有流量现在都已加密。

SMTP 示例

服务器到服务器传输期间的 STARTTLS 协商:

# 在端口 25 上建立的明文连接 S: 220 mx.example.com ESMTP C: EHLO sender.example.net S: 250-mx.example.com S: 250-SIZE 52428800 S: 250-STARTTLS S: 250 ENHANCEDSTATUSCODES # 客户端看到 STARTTLS 可用,请求升级 C: STARTTLS S: 220 2.0.0 Ready to start TLS # --- TLS 握手在此进行 --- # 所有后续流量都已加密 # 客户端必须在 TLS 后重新发出 EHLO C: EHLO sender.example.net S: 250-mx.example.com S: 250-SIZE 52428800 S: 250-AUTH PLAIN LOGIN S: 250 ENHANCEDSTATUSCODES # 注意:STARTTLS 不再公布(已处于活动状态) # 注意:AUTH 现已公布(仅在 TLS 后可用) C: MAIL FROM:<alice@sender.example.net> S: 250 2.1.0 OK C: RCPT TO:<bob@example.com> S: 250 2.1.5 OK C: DATA S: 354 Start mail input C: [message content...] C: . S: 250 2.0.0 OK

关键技术细节

机会性 vs. 强制性 TLS

RFC 3207 中定义的 STARTTLS 的关键限制是默认情况下它是 机会性的:

机会性 TLS 容易受到 降级攻击:网络攻击者可以从 EHLO 响应中删除 STARTTLS 功能,强制连接保持明文。客户端无法知道服务器是否支持 TLS,因为初始协商以明文方式进行。

证书验证

RFC 3207 不要求对 MTA 到 MTA 连接进行严格的证书验证。实际上,许多服务器使用自签名证书或不匹配 MX 主机名的证书。理由是:机会性加密且不验证仍然好于完全不加密。它保护免受被动监视,即使它无法防止主动中间人攻击。

为获得更强的保证,请使用:

STARTTLS 后重新 EHLO

TLS 握手完成后,客户端 必须 发出新的 EHLO 命令。必须丢弃 STARTTLS 前的服务器功能列表。这很重要,因为:

不同端口上的 STARTTLS

端口 协议 TLS 行为
25 SMTP 中继 STARTTLS(MTA 到 MTA 的机会性)
587 提交 STARTTLS(实际上强制性 — AUTH 需要它)
465 提交 隐式 TLS(任何 SMTP 命令前的 TLS 握手)

TLS 报告

RFC 8460 定义了 SMTP TLS 报告 (TLSRPT),允许域所有者接收有关 TLS 连接失败的报告。这是 STARTTLS 的 DMARC 聚合报告等效项 — 它告诉您何时与您的服务器的连接 TLS 协商失败。

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

常见错误

可交付性影响

Related RFCs