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