在 SMTP 中,客户端发送 EHLO,在能力列表中看到 250-STARTTLS 后发送 STARTTLS,随后 TLS 握手在同一条 TCP 连接上进行(服务器之间使用端口 25,邮件提交使用 587)。在邮件服务器之间,它是机会性的:通信路径上的攻击者可以剥离这项能力,发送方便会继续以明文发送,而且发送方通常接受任何证书。
解决办法来自策略层:MTA-STS(RFC 8461)和 DANE(RFC 7672)让接收方域名能够要求经过身份验证的 TLS,TLS-RPT(RFC 8460)则负责报告失败情况。对于客户端访问,RFC 8314 建议使用隐式 TLS(端口 465、993、995),而不是 STARTTLS。升级前的命令注入(缓冲的明文被当作经由 TLS 到达的数据处理)等实现缺陷曾影响过许多邮件服务器。
openssl s_client -starttls smtp -connect mx.example.com:25 会显示证书和协商出的参数;STARTTLS 检测工具执行的是同样的测试。