资讯动态

SNI(Server Name Indication服务器名称指示)介绍(客户端在TLS ClientHello中携带目标域名,让服务器知道应返回哪个域名证书)服务器多域名、ESNI/ECH

发布时间:2026/9/9 23:15:55 来源:尧图企业网站定制
文章目录深入理解 SNIServer Name Indication一、为什么需要 SNI二、SNI 的核心原理三、SNI 工作流程没有 SNI有 SNI四、SNI 在 TLS 中的位置五、SNI 最大的价值1. 一个 IP 支持多个 HTTPS 网站2. 降低 HTTPS 部署成本3. CDN 的基础能力之一六、Nginx 中的 SNI七、Kubernetes Ingress 中的 SNI八、SNI 与 Host Header 的区别SNIHost Header对比九、如何查看 SNI示例不带 SNI 的情况十、SNI 的安全问题十一、ESNI / ECHESNIEncrypted SNIECHEncrypted Client Hello十二、SNI 与 TLS 终止十三、典型应用场景CDNAPI GatewayKubernetes云负载均衡十四、SNI 与 HTTP/2 / HTTP/3十五、抓包观察 SNI十六、常见面试题1. 为什么 HTTPS 需要 SNI2. SNI 在哪一层3. SNI 和 Host Header 区别4. SNI 是否加密十七、总结最后一句话深入理解 SNIServer Name Indication在现代 HTTPS 通信中一个 IP 地址往往需要承载多个 HTTPS 网站。但 TLS 握手发生在 HTTP 请求之前服务器还不知道客户端到底想访问哪个域名。这时候SNIServer Name Indication就登场了。SNI 是 TLS 协议中的一个扩展用于让客户端在 TLS 握手阶段提前告诉服务器“我要访问的域名是哪个。”它是现代 HTTPS 虚拟主机能力的核心基础之一。一、为什么需要 SNI先看一个经典问题。假设同一个服务器 IP 203.0.113.10 托管两个 HTTPS 网站 example.com api.example.comHTTPS 连接建立时客户端先发起 TLS 握手服务器需要立即返回证书但此时 HTTP 请求还没发送服务器并不知道客户端访问哪个域名于是问题来了服务器该返回哪个 TLS 证书如果没有 SNI一个 IP 基本只能对应一个 HTTPS 证书多 HTTPS 虚拟主机难以实现这就是早期 HTTPS 部署成本高的重要原因之一。二、SNI 的核心原理SNI 的思路非常简单客户端在 TLS ClientHello 中携带目标域名。这样服务器在握手阶段就能知道客户端想访问 example.com于是服务器就可以选择正确证书选择正确 TLS 配置路由到对应虚拟主机三、SNI 工作流程下面是 HTTPS 建立连接时的流程。没有 SNIClient ---- TLS Handshake ---- Server Server: “你访问哪个域名” Client: “还没说……”服务器无法正确选择证书。有 SNIClient ---- ClientHello(SNIexample.com) ---- Server Server: “哦你要访问 example.com” “这是对应证书”服务器可以正确返回example.com 的证书对应 TLS 配置注不同域名必须有独立的 TLS 配置“正确 TLS 配置” 与目标域名匹配的证书 协议参数 安全策略四、SNI 在 TLS 中的位置SNI 位于TLS ClientHello Extension也就是说客户端在 TLS 握手第一阶段就会发送。大致结构ClientHello ├── TLS Version ├── Cipher Suites ├── Extensions │ └── server_name (SNI) │ └── example.com五、SNI 最大的价值1. 一个 IP 支持多个 HTTPS 网站这是最核心价值。例如203.0.113.10 ├── a.com ├── b.com ├── c.com每个域名都有独立证书都能正常 HTTPS没有 SNI 基本无法实现。2. 降低 HTTPS 部署成本以前一个 HTTPS 网站 ≈ 一个独立 IPIPv4 非常昂贵。SNI 出现后多个 HTTPS 网站共享同一 IP极大推动 HTTPS 普及。3. CDN 的基础能力之一CDN 边缘节点通常一个 IP 承载成千上万域名例如CDN云负载均衡API GatewayIngress Controller都严重依赖 SNI。六、Nginx 中的 SNINginx 会根据 SNI 自动选择 server block。例如server { listen 443 ssl; server_name example.com; ssl_certificate example.crt; } server { listen 443 ssl; server_name api.example.com; ssl_certificate api.crt; }客户端SNIapi.example.comNginx返回 api.crt七、Kubernetes Ingress 中的 SNIIngress Controller 本质也依赖 SNI。例如spec:tls:-hosts:-api.example.comsecretName:api-certIngress Controller读取 SNI匹配 host返回对应证书因此TLS Host Routing 本质上就是 SNI Routing八、SNI 与 Host Header 的区别很多人容易混淆SNIHTTP Host Header它们完全不是一个层次。SNI发生在TLS 层发送时间TLS 握手阶段用途选择证书Host Header发生在HTTP 层发送时间TLS 建立完成后用途路由 HTTP 请求对比项目SNIHost Header所属层TLSHTTP发送时间TLS 握手时HTTP 请求时作用选择证书路由请求是否加密明文传统 TLSHTTPS 下会被加密九、如何查看 SNI可以使用 OpenSSL。示例openssl s_client\-connectexample.com:443\-servernameexample.com其中-servername就是显式指定 SNI。不带 SNI 的情况openssl s_client-connectexample.com:443有些网站会返回错误证书TLS 握手失败返回默认站点因为服务器不知道你访问哪个域名。十、SNI 的安全问题这里有个重要知识点传统 SNI 是明文的。即使使用 HTTPSTLS ClientHello 中的 SNI 仍然可见因此ISP防火墙中间网络设备仍然能看到你访问了哪个域名虽然看不到完整 URLCookieHTTP 内容但域名本身仍会暴露。十一、ESNI / ECH为了解决 SNI 明文问题后来提出ESNIEncrypted SNI后来演进为ECHEncrypted Client Hello目标加密 TLS ClientHello包括SNI扩展信息这样网络中间人无法看到目标域名。十二、SNI 与 TLS 终止很多网关都会做 TLS TerminationClient ↓ HTTPS Load Balancer / Gateway ↓ HTTP Backend Service在 TLS 终止阶段网关读取 SNI选择证书建立 TLS例如NginxEnvoyHAProxyKongAWS ALB都 heavily 使用 SNI。十三、典型应用场景CDNCloudflare Fastly CloudFrontAPI GatewayKong APISIX TraefikKubernetesIngress Controller Gateway API云负载均衡AWS ALB GCP Load Balancer Azure Front Door十四、SNI 与 HTTP/2 / HTTP/3SNI 与 HTTP 版本无关。即使HTTP/2HTTP/3底层 TLS 仍然需要SNI尤其HTTP/3 使用 QUIC TLS 1.3ClientHello 中依旧存在 SNI十五、抓包观察 SNI使用 Wireshark过滤tls.handshake.extensions_server_name即可看到Server Name: example.com这是分析 TLS 流量时非常常见的方法。十六、常见面试题1. 为什么 HTTPS 需要 SNI因为TLS 握手先于 HTTP 请求服务器需要提前知道域名来选择证书。2. SNI 在哪一层TLS 层3. SNI 和 Host Header 区别SNITLS 阶段选证书Host HeaderHTTP 阶段路由请求4. SNI 是否加密传统 TLS 中不加密ECH 才会加密。十七、总结SNI 本质上是TLS 握手阶段的“域名提示机制”它解决了一个 IP 承载多个 HTTPS 网站的问题。现代互联网大量基础设施都依赖 SNICDNIngressAPI Gateway云负载均衡Service Mesh可以说没有 SNI就没有今天低成本、大规模 HTTPS 的普及。最后一句话记住这句话Host Header 决定 HTTP 路由 SNI 决定 TLS 证书这是理解现代 HTTPS 网关体系的关键。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价