术语表

STARTTLS (明文连接升级为 TLS)

最后核实

定义

STARTTLS 是一条协议命令,用于把 SMTP、IMAP、POP3 等协议中已建立的明文连接,在同一端口上升级为 TLS 加密连接。

STARTTLS(POP3 中叫 STLS)的流程是:客户端先以明文连接,确认服务器声明支持 TLS,再发送命令,把同一条 TCP 连接切换为 TLS。SMTP 的 STARTTLS 由 RFC 3207 定义,IMAP 和 POP3 见 RFC 2595,XMPP、LDAP 也有各自的等价机制。与之相对的是隐式 TLS:连接一建立就直接开始 TLS,使用专门端口,如 SMTP 提交用 465、IMAP 用 993、POP3 用 995。

为什么重要

升级这一步本身没有保护。主动攻击者可以把服务器响应里的 STARTTLS 能力删掉,或让命令执行失败,很多客户端就会继续用明文通信。邮件服务器之间在 25 端口上的 TLS 通常是“能加密就加密”,往往根本不校验证书。防御办法:让用户侧客户端强制要求 TLS;服务器之间则发布 DANE 的 TLSA 记录(RFC 7672)或 MTA-STS 策略(RFC 8461),让发信方坚持经过认证的 TLS。RFC 8314 建议用户收发邮件优先使用隐式 TLS。在企业邮件系统和云服务器上自建邮局时,这些都值得逐项核对。

例子

openssl s_client -connect mail.example.com:25  -starttls smtp -servername mail.example.com </dev/null
openssl s_client -connect mail.example.com:587 -starttls smtp -servername mail.example.com </dev/null
openssl s_client -connect mail.example.com:143 -starttls imap -servername mail.example.com </dev/null

也可以用 STARTTLS 检测工具从外部网络做同样的测试。

常见误区

  • STARTTLS 是和 TLS 不同的另一种协议。 它只是一条命令,执行后连接里跑的就是普通的 TLS 和普通的证书。
  • 双方邮件服务器都支持 STARTTLS,邮件就是端到端加密的。 它只保护每一跳,没有 DANE 或 MTA-STS 时某一跳被降级也可能无人察觉;端到端保护需要 S/MIME 之类的方案。
  • 465 和 587 端口可以随便换。 465 要求第一个字节起就是 TLS,587 要求先明文再 STARTTLS,配错会导致握手失败或超时。

延伸阅读