技术解析 · 附来源的解答
STARTTLS:通过机会性 TLS 实现安全的 SMTP 通信
STARTTLS 是一种 SMTP 服务扩展,可使用 TLS 将不安全的连接升级为安全连接。它让客户端和服务器能够在同一个端口上协商出安全通道,确保邮件内容和身份验证凭据在传输过程中被加密。
工作机制
该过程从标准的明文 SMTP 握手开始。服务器在 EHLO 响应中声明支持 STARTTLS,客户端随即发出 STARTTLS 命令。如果服务器接受,双方会执行 TLS 握手以建立加密。安全层启用后,会话继续使用标准的 SMTP 命令,但后续所有数据都会被加密。
对发件人的重要性
STARTTLS 通过加密邮件服务器之间的通信路径,防止窃听和中间人攻击。没有它,SMTP 流量将以明文传输,敏感的邮件正文和登录凭据会暴露给任何监控网络路径的人。大多数现代收件服务器会优先使用甚至要求加密连接才接收邮件。
运维注意事项
一个严重的风险是降级攻击:攻击者从服务器响应中剥离 STARTTLS 命令,迫使客户端以明文发送邮件。为防止这种情况,管理员可以部署 MTA-STS 或配置强制 TLS。使用 SendHQ 免费工具(https://sendhq.cc/tools)可以帮助验证域名的整体配置,改善投递效果。
常见实现错误
一个常见错误是将 STARTTLS 与隐式 TLS 混淆。STARTTLS 从明文端口(如 587)开始,然后进行升级;而隐式 TLS(465 端口)要求在发送任何 SMTP 命令之前先完成安全握手。端口配置错误或未提供有效的 SSL 证书,会导致连接失败或回退到不安全的传输方式。
具体示例
客户端连接到 587 端口并发送 EHLO。服务器响应 250-STARTTLS。客户端发送 STARTTLS。服务器响应 220 Ready to start TLS。客户端与服务器协商密钥并加密会话。随后,客户端发送 AUTH LOGIN,在不将凭据暴露给网络的情况下安全地提供凭据。
团队常问的问题
STARTTLS 和 SSL/TLS 是一回事吗?
STARTTLS 是一条命令,用于在已有的明文连接上启动 TLS 会话;而 SSL/TLS 指的是底层的加密协议本身。
如果 STARTTLS 失败会怎样?
默认情况下,大多数服务器使用机会性 TLS,即握手失败时会回退到明文传输,除非显式配置了强制 TLS。
STARTTLS 通常使用哪个端口?
587 端口是使用 STARTTLS 的标准提交端口,不过在服务器之间中继邮件的 25 端口上也经常使用 STARTTLS。
一手资料
- RFC 3207:基于传输层安全(TLS)的安全 SMTP 服务扩展 — RFC Editor
- RFC 8314:SMTP 之外邮件协议的明文传输注意事项 — RFC Editor