结论:HTTPS 回源时,SNI 决定源站出示哪张证书,Host 决定源站把请求交给哪个站点,两者必须指向同一个域名;一旦不一致,轻则回源证书校验失败、握手直接中断,重则串站返回同 IP 上另一个站点的内容,并被 CDN 缓存下来。
SNI 和 Host 分别管什么?为什么必须一致?
SNI(Server Name Indication,TLS 握手 ClientHello 中携带的域名)决定源站出示哪张证书,Host 是 HTTP 请求头字段,决定 Nginx 的 server_name、Apache 的 VirtualHost 把请求路由到哪个站点——这是两套完全独立的机制。
一个 IP 上放多个 HTTPS 站点是国内站长的常态,而 TLS 握手发生在 HTTP 报文之前,源站只能靠 SNI 选证书;握手完成后才读到 Host 选站点。所以 SNI 指向 A、Host 指向 B 时,客户端拿到的是 A 的证书、访问到的却是 B 的内容。CDN 节点会校验证书域名与回源目标域名是否匹配,不匹配就判定握手失败并中断回源。
哪些配置最容易造成不一致?
结论:四类配置问题覆盖了绝大多数案例——源站填 IP 未配 SNI、回源 Host 沿用加速域名、同 IP 多站混用、回源端口与强制跳转冲突。
- 源站地址填 IP、回源 SNI 留空:源站只能返回
default_server 的证书,多为其他域名证书或自签证书,握手阶段就失败。
- 回源 Host 沿用加速域名
www.example.com,源站证书却只签了 origin.example.com:证书域名不匹配,回源报错或返回 421。
- 源站同 IP 多站,SNI 落到默认站点、Host 指向目标站点:串站,返回他人内容并可能污染缓存。
- 回源端口走 80,源站却开了 301 强制跳 HTTPS:形成重定向循环,表现为回源超时。
补充一个判断依据:421 Misdirected Request 是 HTTP/2 连接复用(connection coalescing)下,客户端把请求复用到不匹配连接上时源站返回的标准状态码,看到 421 基本可直接判定 SNI 与 Host 不一致。
怎么快速判断是 SNI 还是 Host 配错了?
结论:用 openssl 看证书判断 SNI,用 curl 带 Host 打源站 IP 判断路由,两条命令即可区分。
看证书(验证 SNI):
openssl s_client -connect 1.2.3.4:443 -servername www.example.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -ext subjectAltName
看路由(验证 Host):
curl -k -I --resolve www.example.com:443:1.2.3.4 https://www.example.com/
证书 SAN 列表里没有 www.example.com,是 SNI 配错;证书正确但返回 404 或落到默认站点,是 Host 配错。
一致性问题怎么改?三种方案怎么选?
结论:优先把回源 Host 与回源 SNI 统一设为源站真实域名,让加速域名与源站域名解耦。
方案一(推荐):回源 Host 和回源 SNI 都填 origin.example.com,源站证书签这个域名。换 CDN 厂商时源站无需改动,配置成本最低。
方案二:源站改用多域名 SAN 证书,把加速域名一并加进 SAN,回源 Host 保持加速域名。适合源站无法改配置的场景,代价是证书要随域名增减维护。
方案三:IP + 自签证书回源,在 CDN 侧开启「忽略回源证书校验」。仅建议内网或专线回源使用,公网回源等于主动放弃中间人防护。
同时在源站加兜底 server 块,阻止 SNI 不匹配时落到第一个站点(nginx 1.19.4 及以上支持 ssl_reject_handshake):
server {
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
}
改完怎么验证?
结论:三步验收——证书、状态码、缓存。
再跑一次 openssl s_client,确认返回证书的 SAN 包含回源 SNI 域名;用 curl -I 确认返回 200 而非 421 或 404;最后在 CDN 控制台刷新缓存,用 curl -I 打加速域名看是否还有回源告警。源站多站共 IP 的环境,建议顺手把每个站点的 SNI 与 Host 组合都测一遍,避免只修了主站。
配置细节和踩坑记录可以直接发到社区「SSL/CDN/网站防护」版块,把回源 SNI、回源 Host、源站证书 SAN 三项信息写全,别人复现起来最快。