SNI 到底是什么,为什么虚拟主机必须配
一个 IP 上挂多个站点时,TLS 握手凭什么知道该给哪张证书。
没有 SNI 的年代
早期一个 IP 只能配一张证书,因为 TLS 握手发生在读到 HTTP 请求之前,服务端还不知道客户端要访问哪个域名。要在一台机器上放多个 HTTPS 站点,只能给每个站分配独立的 IP。
SNI 把域名信息提前塞进了 ClientHello,服务端在握手阶段就能知道目标主机,这才有了后来的虚拟主机。
配置里容易踩的地方
nginx 里 server_name 写不全会直接体现为证书不匹配。想覆盖二级域名时通常写 server_name example.com *.example.com。
另一个常见误解是泛解析:DNS 上加了 * 记录不等于证书能覆盖所有子域,证书的 SAN 里必须显式包含 *.example.com。两件事要分别做。
怎么验证
对同一个 IP,用不同的 -servername 各连一次,比较返回证书的 CN/SAN。如果两个域名的结果完全一样,说明服务端没有按 SNI 分流,配置需要检查。