SNI、ALPN、HTTP Host和证书SAN有什么区别?
SNI在TLS握手期间告诉服务器客户端想访问哪个主机名,服务器可据此选择证书和安全策略;ALPN在TLS握手中协商连接随后使用的应用层协议,例如HTTP/2;HTTP Host 或 HTTP/2、HTTP/3中的 :authority 标识请求针对哪个主机与端口;证书SAN列出证书声明覆盖的身份名称,供客户端执行服务器身份校验。
本文目录(19 节)
直接答案
SNI在TLS握手期间告诉服务器客户端想访问哪个主机名,服务器可据此选择证书和安全策略;ALPN在TLS握手中协商连接随后使用的应用层协议,例如HTTP/2;HTTP Host 或 HTTP/2、HTTP/3中的 :authority 标识请求针对哪个主机与端口;证书SAN列出证书声明覆盖的身份名称,供客户端执行服务器身份校验。
它们可能包含相同域名,却不是同一个字段,也不能互相替代。典型HTTPS流程是先连接IP,再发送包含SNI和ALPN的TLS ClientHello,验证服务器返回的证书是否覆盖目标主机,TLS完成后才发送带 Host 或 :authority 的HTTP请求。
一、四个概念对比
| 名称 | 所在层级与阶段 | 谁发送或提供 | 主要用途 |
|---|---|---|---|
| SNI | TLS握手 | 客户端 | 表明希望连接的服务器名称 |
| ALPN | TLS握手 | 客户端列出、服务器选择 | 协商后续应用协议 |
| Host / :authority | HTTP请求 | HTTP客户端 | 标识目标URI的主机和可选端口 |
| 证书SAN | X.509证书 | 服务器出示的证书 | 声明证书覆盖的DNS名、IP等身份 |
排障时应按出现顺序观察,而不是看到一个域名相同就认为其他字段一定正确。
二、SNI是什么
RFC 6066定义了TLS server_name 扩展。客户端通过域名定位服务器时,通常在ClientHello中携带主机名。共享同一IP和端口的服务器可以根据SNI选择合适的证书、虚拟站点或安全策略。
SNI不负责DNS解析,也不是HTTP头。DNS先把域名解析为地址,客户端才能建立到该地址的连接;SNI随后出现在TLS握手。若直接用IP连接且客户端未发送预期SNI,共享服务器可能返回默认证书或拒绝握手。
三、ALPN是什么
RFC 7301定义应用层协议协商扩展。客户端在ClientHello中发送其支持的协议标识列表,服务器选择一个并在握手中返回结果。常见标识包括HTTP/2使用的 h2 和HTTP/1.1使用的 http/1.1。
ALPN回答“这条加密连接里接下来讲哪种应用协议”,不回答“访问哪个域名”。一个连接可以同时携带SNI www.example.com 和ALPN候选 h2,http/1.1,两者职责独立。
四、HTTP Host是什么
RFC 9110规定,HTTP请求中的 Host 提供目标URI的主机和端口信息,使同一服务器能区分多个主机名对应的资源。在HTTP/2和HTTP/3中,这项信息有时由 :authority 伪头字段承载。
Host属于HTTP阶段。对于HTTPS,服务器通常要先完成TLS握手和证书处理,之后才能读取普通HTTP请求。因此,不能依赖Host来完成握手前的证书选择。
五、证书SAN是什么
SAN是X.509证书的Subject Alternative Name扩展。RFC 5280规定,DNS身份可放在其中的 dNSName 项,IP身份则使用相应IP地址形式。一张证书可以包含多个SAN,从而声明覆盖多个名称。
SAN不是客户端对目标名称的提示,而是证书对身份覆盖范围的声明。客户端还必须验证证书链、有效期、用途和目标名称匹配;“证书里出现某个名字”并不单独证明证书可信。
六、完整HTTPS连接顺序
- 客户端从URL取得目标主机名和端口。
- DNS或本地解析得到目标IP地址。
- 客户端与IP建立TCP连接,或为HTTP/3建立基于UDP的QUIC连接。
- TLS ClientHello携带SNI,并可携带ALPN协议候选。
- 服务器依据配置选择证书和应用协议。
- 客户端验证证书链及SAN与目标身份是否匹配。
- TLS握手成功后,客户端发送HTTP请求,其中包含Host或
:authority。 - Web服务器或反向代理再按HTTP主机与路径路由到应用。
不同协议版本会改变传输细节,但这条“定位地址、TLS协商、身份校验、HTTP路由”的逻辑链仍可用于诊断。
七、SNI和Host为什么通常相同
普通浏览器访问 https: 时,SNI和HTTP authority通常都来自URL中的 api.example.com,所以看起来相同。这种一致性让共享主机先在TLS层选择正确证书,再在HTTP层选择正确站点。
但代理、网关、测试工具或错误配置可能让两者不同。例如,连接时用一个SNI通过TLS握手,随后发送另一个Host。RFC 6066提醒,依赖两者一致的服务器实现必须检查差异,不能默认它们永远相同。
八、SNI和SAN有什么区别
SNI是客户端提出的目标名称;SAN是服务器证书声明覆盖的名称。服务器可根据SNI选择一张包含匹配SAN的证书,客户端再验证匹配关系。
如果SNI正确但证书SAN不覆盖目标域名,通常出现名称不匹配错误。如果SNI错误,服务器可能选错证书,最终也表现为证书错误。两类故障表面相近,抓取握手信息才能区分。
九、ALPN和SNI有什么区别
SNI选择服务器名称上下文,ALPN选择连接上的应用协议。SNI正确但ALPN没有共同协议时,服务器可能终止握手,或按实现回退。ALPN协商出HTTP/1.1而不是HTTP/2时,站点仍可能正常打开,只是使用不同协议版本。
排查“域名可达但HTTP/2没有启用”时,应看ALPN结果;排查“同IP返回错误站点或错误证书”时,应优先看SNI和证书选择。
十、Host和证书SAN有什么区别
Host用于HTTP请求路由,SAN用于TLS服务器身份验证。服务器即使接受任意Host,客户端也不应因此忽略证书名称错误。反过来,证书覆盖多个域名也不代表HTTP服务器为这些域名都配置了正确虚拟主机。
因此会出现“证书验证成功但返回404”的情况:TLS层身份可接受,HTTP层却没有对应Host路由。也会出现“服务端能返回页面但浏览器拦截”的情况:HTTP路由存在,证书身份却不匹配。
十一、HTTP/2与HTTP/3为什么常看到:authority
HTTP/1.1使用 Host 头字段传递目标主机与端口。HTTP/2和HTTP/3使用控制数据中的 :authority 伪头字段表达相应URI authority;RFC 9110说明Host在这些版本中有时由:authority替代。
反向代理在协议版本之间转换时,应正确映射Host和:authority。若二者冲突或被错误重写,可能出现421 Misdirected Request、错误虚拟主机或缓存键混乱。
十二、代理协议配置中为什么会同时出现这些名称
某些传输配置会分别要求连接地址、TLS server name、ALPN、HTTP Host或路径。它们对应不同阶段,允许网关和虚拟主机按各自层级处理连接。字段名称由具体实现定义,不能把一种客户端的配置直接套到另一种实现。
排障时先确认每个字段属于DNS、TLS还是HTTP,再核对客户端与服务端版本。不要为了让连接成功而随意关闭证书验证;这会掩盖身份错误并削弱安全边界。
十三、常见故障如何定位
返回默认证书
检查客户端是否发送了预期SNI,以及服务器是否为该SNI配置正确证书。只修改HTTP Host通常无法修复握手阶段的证书选择。
证书名称不匹配
核对URL目标主机、SNI和证书SAN。不要只看证书Subject显示名称,也不要用忽略验证作为长期方案。
HTTP/2没有协商成功
查看客户端ALPN候选和服务器选择结果,确认双方支持 h2 且TLS配置满足实现要求。Host正确与否不能证明ALPN成功。
TLS成功但访问错误站点
检查Host或:authority是否被代理重写,并查看反向代理虚拟主机规则。此时证书正确不代表HTTP路由正确。
十四、安全检查边界
- 不把关闭证书验证当作兼容模式。
- 不将SNI相同误认为证书链可信。
- 不接受与目标身份无关的SAN条目。
- 不让代理在未经验证时信任任意Host进行内部路由。
- 分享日志前遮盖认证信息、内部域名和真实节点地址。
- 使用最小测试域名复现,不上传完整生产配置。
十五、最小验证方法
固定一个URL,记录DNS结果、目标IP和端口。用能显示TLS握手信息的本地工具核对SNI、服务器证书SAN与ALPN结果,再查看HTTP请求中的Host或:authority和响应状态。每次只改变一个字段并建立新连接。
若经过反向代理,分别保存入口与上游的脱敏日志。这样可以判断字段是在客户端生成错误、TLS终止点选择错误,还是HTTP转发时被改写。
十六、FAQ
SNI正确就一定不会出现证书错误吗?
不一定。服务器仍可能返回错误、过期或不受信任的证书,SAN也可能不覆盖目标名称。客户端必须完成整套证书验证。
Host可以代替SNI吗?
不能。HTTPS服务器在读取普通HTTP Host之前通常已完成TLS握手,需要SNI帮助选择证书和TLS上下文。
ALPN会决定访问哪个网站吗?
ALPN主要决定连接使用哪种应用协议,不负责选择域名。网站身份与路由还涉及SNI、证书和HTTP authority。
SAN里有通配符就覆盖所有子域名吗?
不能笼统判断。匹配规则受证书身份验证规范和客户端实现约束,通配符通常也不会无限跨越多个标签。应以目标名称的实际验证结果为准。
用IP访问HTTPS为什么经常报证书错误?
证书常为DNS名称签发,直接用IP访问时目标身份变成IP;若证书SAN没有对应IP地址,名称验证会失败,且服务器可能因缺少正确SNI返回默认证书。
十七、结论
SNI告诉TLS服务器目标主机,ALPN协商后续应用协议,Host或:authority标识HTTP请求目标,证书SAN声明服务器证书覆盖的身份。它们在一条连接中前后衔接,却承担不同职责。按DNS、TLS名称、协议协商、证书验证和HTTP路由的顺序检查,能避免把所有问题都归因于“域名配置错误”。
核验来源
- RFC Editor:RFC 6066,TLS Extensions: Server Name Indication,https:
/ :2026-08-25)/ www. rfc- editor. org/ info/ rfc6066/ (核验日期 - RFC Editor:RFC 7301,TLS Application-
Layer Protocol Negotiation,https: / :2026-08-25)/ www. rfc- editor. org/ info/ rfc7301/ (核验日期 - RFC Editor:RFC 9110,HTTP Semantics,https:
/ :2026-08-25)/ www. rfc- editor. org/ info/ rfc9110/ (核验日期 - RFC Editor:RFC 5280,Internet X.509 PKI Certificate and CRL Profile,https:
/ :2026-08-25)/ www. rfc- editor. org/ info/ rfc5280/ (核验日期