Files
waf-platform/EdgeHttpDNS/SNI隐匿开发计划.md
2026-02-27 10:35:22 +08:00

93 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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