3.3 KiB
3.3 KiB
SNI隐匿开发计划(HTTPDNS专项)
0. 目标
在明文网络层(DNS 与 TLS ClientHello)中不出现真实业务域名;真实业务域名仅出现在加密后的 HTTP 层(Host / :authority)中传输。
1. 固定原则
- 只做 SNI 隐匿能力,不引入其他无关能力描述。
- 客户端不走系统 DNS 解析业务域名。
- TLS 握手阶段不发送真实业务域名 SNI。
- CDN/WAF 节点必须支持“空SNI接入 + Host路由”。
- 真实域名只在 HTTPS 加密通道内携带。
2. 端到端链路(目标形态)
- App 调用 SDK,请求解析业务域名。
- SDK 从 HTTPDNS 获取业务域名对应的“接入 IP 列表”(不是业务域名 DNS)。
- SDK 直连接入 IP 发起 TLS:
- SNI 置空(或不发送)
- 不出现真实业务域名
- TLS 建立后发起 HTTPS 请求:
- Host / :authority = 真实业务域名
- CDN/WAF 节点在解密后读取 Host,将流量路由到对应业务源站。
3. SDK 改造要求
3.1 连接行为
- 提供“按 IP 直连”的请求通道。
- TLS 握手时固定空 SNI,不允许带真实域名。
- HTTP 层强制写入真实 Host / :authority。
3.2 证书校验
- 仍必须做证书链校验(不允许关闭 TLS 安全校验)。
- 证书校验目标为接入层证书(CDN/WAF 对外证书),而非业务源站证书。
3.3 多IP与容错
- HTTPDNS 返回多个接入 IP 时,SDK 按顺序/策略重试。
- 连接失败可切换下一 IP。
- 缓存与过期策略保持稳定,避免频繁抖动。
3.4 多端一致性
- Android/iOS/Flutter 需保证一致行为:
- 空 SNI
- Host 注入
- 失败重试策略
- 文档与示例代码同步更新。
4. CDN/WAF 节点改造要求
4.1 TLS 接入
- 支持无 SNI ClientHello 的 TLS 握手。
- 为接入域名部署有效证书(覆盖客户端连接目标)。
4.2 路由逻辑
- 以 Host / :authority 作为业务路由主键。
- 路由匹配前做标准化:
- 小写化
- 去端口
- Host 未命中时返回明确错误(4xx),禁止兜底到默认站点。
4.3 回源行为
- 节点到源站可继续使用 HTTPS 回源。
- 回源主机名与证书校验按现有网关策略执行。
4.4 可观测性
- 增加日志字段:
tlsSniPresent(是否携带 SNI)hostrouteResult
- 可按“空SNI请求占比、Host路由命中率”监控。
5. 控制面(管理端)要求
- 页面仅展示“已启用 SNI 隐匿(空SNI)”,不提供策略切换。
- 集群侧需可检查“节点是否支持空SNI接入”。
- 发布配置时支持灰度与回滚。
6. 验收标准
- 抓包验证:
- DNS 明文流量中不出现真实业务域名
- TLS ClientHello 中不出现真实业务域名 SNI
- 请求验证:
- HTTPS 请求 Host 为真实业务域名
- CDN/WAF 按 Host 正确路由
- 稳定性验证:
- 多 IP 切换成功
- 节点故障时请求可恢复
7. 上线顺序
- 先升级 CDN/WAF 节点能力(空SNI接入 + Host路由)。
- 再升级 SDK(空SNI + Host注入)。
- 最后按应用灰度开启,观察指标后全量。
8. 风险与约束
- 若 CDN/WAF 不支持空 SNI,链路会在握手阶段失败。
- 若 Host 路由不严格,可能出现串站风险。
- 若客户端错误关闭证书校验,会引入严重安全风险。