什么是 MTA-STS?怎么部署它来防止邮件传输途中的 TLS 降级攻击和中间人窃听?

64 什么是 MTA-STS?怎么部署它来防止邮件传输途中的 TLS 降级攻击和中间人窃听?
MTA-STS 解决什么问题

SMTP 默认不加密——邮件传输途中可以被中间人(MITM)窃听。STARTTLS 提供了加密选项但属于"机会性加密"(Opportunistic Encryption):发信服务器发出 STARTTLS 命令、收件方响应并开始 TLS 握手——但如果攻击者删除了 STARTTLS 命令(降级攻击),发信方就会用明文发送邮件。MTA-STS(RFC 8461)解决了这个问题:收件方域名公开发布强制加密策略——声明"发给我域的邮件必须走 TLS 加密、必须验证证书"。发信方检查收件方 MTA-STS 策略后:如果有 MTA-STS→强制 TLS;如果没有→回退到机会性加密。

部署(两步、两文件)

Step 1:DNS TXT 记录
在你的 DNS 新增一条 TXT 记录:
名称:_mta-sts.yourdomain.com
值:v=STSv1; id=20260706203000
其中 id 是数字串(推荐时间戳 YYYYMMDDHHMMSS)——每次更新策略时必须递增 否则发信方不会重新获取。

Step 2:HTTPS 策略文件
在你的 mta-sts.yourdomain.com 的 Web 服务器上创建路径:
/.well-known/mta-sts.txt
内容:
version: STSv1
mode: testing ← 先 testing 测试几天
mx: mx1.yourdomain.com
mx: mx2.yourdomain.com
max_age: 86400 ← 策略缓存秒数(1天)
HTTPS 必须有有效证书(建议 Let's Encrypt)。

确认 testing 阶段无投递故障后改为:
mode: enforce ← 强制加密 未加密则拒收
同时增大 max_age:max_age: 604800(7天)。

配合 TLS-RPT(RFC 8460)获取报告

再新增一条 DNS TXT:
名称:_smtp._tls.yourdomain.com
值:v=TLSRPTv1; rua=mailto:tls-reports@yourdomain.com
支持 MTA-STS 的发信方会每天向这个地址发送 JSON 格式的 TLS 投递报告——哪些邮件 TLS 成功、哪些失败了、失败原因是什么。类似 DMARC RUA 报告但针对 TLS 层面。

注意事项

• MTA-STS 只强制入向(别人发给你的邮件走加密)——不影响你出向的邮件。
• MTA-STS 不是 SPF/DKIM/DMARC 的替代——这四者是互补的独立维度。
• 测试工具:dig txt _mta-sts.yourdomain.com 验证 DNS;curl https://mta-sts.yourdomain.com/.well-known/mta-sts.txt 验证策略文件。
• Postfix 可以用 postfix-mta-sts-resolver(GitHub 开源 daemon)自动查询外域 MTA-STS 策略。

参考:RFC 8461(MTA-STS)· RFC 8460(TLS-RPT)· EasyDMARC MTA-STS Checker · GitHub postfix-mta-sts-resolver