SMTP 加密方式是什么
SMTP 有两种加密姿势。STARTTLS 是「先明文打个招呼,再升级为加密」:客户端连上端口后发 EHLO,从应答里看到服务器支持 STARTTLS,就发 STARTTLS 命令把这条连接升级为 TLS 会话,默认用在 25 与 587 端口。隐式 TLS 则是「连上就是密文」:TCP 握手完成后立刻做 TLS 握手,客户端从第一字节起就在加密通道里说话,典型端口是 465。二者加密强度相同,差别在升级时机与对中间设备的友好度。
基本信息
| STARTTLS | 端口 25/587,EHLO 后发 STARTTLS 再握手 |
|---|---|
| 隐式 TLS | 端口 465,TCP 连上立即 TLS 握手 |
| 规范 | RFC 3207(STARTTLS)、RFC 8314(现代端口建议) |
| 提交端口 | 587 提交、465 隐式加密提交,均用于客户端发信 |
| 排障工具 | openssl s_client -starttls smtp -crlf |
| 加固方向 | MTA-STS、DANE、强制 TLS 证书校验 |
典型使用场景
- 配置邮件客户端:内网中继选 587 + STARTTLS,或 465 隐式加密
- 排查「认证失败」:确认客户端是否真的完成了 TLS 升级
- 给自建 MTA 加固:要求对端必须 STARTTLS 才能投递
- 验证证书:手动跑一次 openssl s_client 观察证书链与协议版本
- 识别服务器是否支持现代端口:探测 465 是否可用
手动验证加密会话
手动验证加密会话
# STARTTLS:连接后进入交互,观察 EHLO 是否返回 STARTTLS
openssl s_client -starttls smtp -connect mail.example.com:587 -crlf -quiet
# 隐式 TLS:不指定 -starttls,直接握手
openssl s_client -connect mail.example.com:465 -servername mail.example.com
# 端口连通性速测
nc -zv mail.example.com 25 465 587两种模式对照
| 模式 | 端口 | 触发方式 | 特点 |
|---|---|---|---|
| STARTTLS | 25/587 | EHLO 后发 STARTTLS 再握手 | 兼容老链路,但存在降级攻击面 |
| 隐式 TLS | 465 | 连接建立即 TLS 握手 | 无降级空间,现代提交推荐 |
| 提交端口 | 587 | STARTTLS 加密后 AUTH | 客户端发信标准入口 |
| 中继端口 | 25 | MTA 之间投递 | 常受云厂商出站封禁 |
| 强制校验 | 任一 | 校验对端证书再投递 | 配合 MTA-STS/DANE 可防中间人 |
STARTTLS 有降级(STRIPTLS)攻击面:中间人可以拦掉 EHLO 应答里的 STARTTLS 一行,逼客户端在明文通道里继续发送凭据与正文。客户端与 MTA 都该把加密设为「必须」,一旦对端不支持就失败放弃,而不是回退明文。
明文回退是最容易被忽略的配置:把「STARTTLS 可选」配成「失败也继续」后,一次网络抖动或一次被篡改的应答,就能让凭据与邮件正文以明文经过中间节点,且收发双方都不会收到任何报错提示。