文字与生活
同一 IP 为什么返回不同证书?SNI 与 Host 的区别
同一 IP 为什么返回不同证书?SNI 与 Host 的区别
一个 IP 地址上可以托管多个 HTTPS 网站。浏览器访问不同域名时,虽然可能连到同一个 IP,服务器仍能返回对应站点的证书和内容。这依靠的是不同协议阶段里的两个名称:TLS 握手阶段的 SNI,以及 HTTP 请求里的 Host(HTTP/2、HTTP/3 中对应 :authority)。
理解这一区别,对机场节点排障很实用:证书错误通常发生在 HTTP 请求发送之前,单纯改 Host 请求头往往修不好 SNI 或证书校验问题。
请求实际经过哪些步骤
- 客户端解析 URL 中的域名,得到 IP。
- 与目标 IP 建立 TCP 或 QUIC 连接。
- TLS ClientHello 通过 SNI 告诉服务器希望访问的主机名。
- 服务器据此选择证书,客户端核验证书名称。
- TLS 成功后,客户端才发送带 Host 或
:authority的 HTTP 请求。
RFC 6066 规定了 TLS server_name 扩展。它解决的是一个服务器地址承载多个虚拟主机时,服务器在握手阶段如何选择合适凭据的问题。
用 curl 做安全的单次验证
如果你有权测试某个网站,并已知它当前使用的服务器 IP,可以执行:
curl -v --resolve example.com:443:203.0.113.10 https://example.com/
把域名和示例 IP 换成真实测试目标。--resolve 临时把指定主机与端口映射到该地址,同时 URL 仍保留原域名,因此 SNI、证书校验和 HTTP 主机名保持一致。该设置只作用于这一条命令,不会改系统 hosts。
不要用 -k 或 --insecure 绕过证书错误作为“修复”。那只会跳过重要校验,无法证明代理路径正常。
常见误判
- 只在请求中添加
Host:。 TLS 已在 HTTP 之前完成,证书选择可能早已错误。 - 直接访问
https://IP/。 URL 主机名变成 IP,SNI 和证书校验目标都会变化,结果不能等同于访问原域名。 - 看到同一 IP 就认为同一网站。 CDN、反向代理和共享主机都可能让多个域名复用地址。
- 换机场节点后证书异常就认定节点劫持。 还应核对系统时间、目标域名、客户端日志和直连对照,避免越过证据下结论。
验收思路
在同一设备上分别做直连、正常代理和另一个节点三次请求,保持 URL 不变,记录解析地址、TLS 证书名称、HTTP 状态与时间。如果只有某一节点在 TLS 阶段失败,证据才开始指向该路径;如果直连同样失败,应先检查目标站点或本机环境。
机场推荐或协议测评不应只写“能打开”。把 DNS、连接、SNI、证书和 HTTP 响应分开记录,结论更可复核。
可核验来源:RFC 6066:TLS 扩展中的 Server Name Indication、curl --resolve 官方说明。
评论