跳到主内容
快讯直播
AI智模界
AI 词典

SNI:一个 IP 托管多个 HTTPS 站点

一句话定义:SNI(Server Name Indication,服务器名称指示)是 TLS 握手时的一个扩展字段。客户端在建立加密连接之前,会先明确告诉服务器“我要访问哪个域名”,这样服务器才能选对证书。

为什么会有这个字段

IP 地址是门牌号,域名是公司名。早期一个 IP 只对应一张证书、一个站点,服务器不需要知道你要找谁。但 CDN、云主机、虚拟主机把成百上千个网站放在同一个 IP 上之后,问题就出现了:TLS 握手的第一步,服务器只收到一条 ClientHello 消息,此时加密还没建立,HTTP 请求根本还没发出来,服务器无法从 HTTP 请求里读到域名。因此协议在 ClientHello 里加了一行 SNI,相当于客户端先在门口报一声要找哪家公司,前台据此递出对应的证书。

生活化的比方:一栋写字楼共用一个门牌号(IP),里面有很多公司(域名)。你到前台说“我找某某公司”,前台才知道该给你哪家公司的访客卡(证书)。SNI 就是那句报名字的话;问题在于,这句话是当众喊出来的,排队的人都听得见。

几个容易混淆的概念

概念发生时机是否加密作用
DNS握手之前通常明文(DoH/DoT 可加密)把域名解析成 IP
SNITLS 握手首条消息明文让服务器挑对证书
HTTP Host 头握手之后加密(在 TLS 内)告诉 Web 服务器访问哪个站点
ECHTLS 握手加密把整条 ClientHello 连 SNI 一起藏起来

关键对比是 SNI 和 Host 头:两者都在表达“我要哪个网站”,但 Host 头在加密通道里,SNI 在通道外。所以抓包时看不到你请求了什么页面,却看得到你连了哪个域名。

ECH(Encrypted Client Hello)就是为了解决这一点。它把整条 ClientHello(含 SNI)用公钥加密,公钥通过 DNS 的 HTTPS 记录发布,其前身是 ESNI。要注意 ECH 需要客户端、服务端、DNS 三方都支持才生效,不是某一方单独开启就行。

对实际工作的意义

对开发者:一台机器上放多个 HTTPS 站点,必须正确配置按域名分发证书,否则客户端会拿到不匹配的证书而报错;非常老的客户端不支持 SNI,会一律落到默认站点上。

对普通职场人:地址栏的小锁只保证“内容没被偷看”,不保证“你访问了谁”这件事保密。企业网关、公共 Wi-Fi 常常按 SNI 做分流、审计或拦截,即使正文加密也一样。想让“连了哪个域名”也不暴露,得靠 ECH 配合加密 DNS,具体支持情况以各浏览器与服务商的官方页面为准。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。