93 lines
3.3 KiB
Markdown
93 lines
3.3 KiB
Markdown
# 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. 若客户端错误关闭证书校验,会引入严重安全风险。
|