ESA提示SNI deny - H3协议

更新时间:
复制为 MD 格式

问题描述

在使用H3(HTTP/3)协议访问ESA加速域名时,出现SNI deny错误提示。

根因分析

ESA开启了SNI白名单功能,当TLS握手中的ServerNameHTTP请求头中的Host不一致时,ESA会拒绝该请求并返回SNI deny错误。

H3协议场景下,由于HTTP/3基于QUIC协议,支持多路复用,客户端可能在同一连接上发送多个不同域名的请求。如果这些请求的SNIHost头不一致,且未在SNI白名单中配置,就会触发SNI deny错误。

SNI白名单配置

  1. ESA控制台,选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择SSL/TLS > 边缘证书

  3. 单击SNI白名单右侧的配置

image

复现方法

开启SNI白名单后,可以通过以下命令复现问题:

curl https://domain1/ -H 'Host:domain2'

上述命令中,TLS握手的ServerNamedomain1,但HTTP请求的Host头是domain2,如果domain2未在SNI白名单中,就会触发SNI deny错误。

案例分享

案例信息

配置情况:

  • 启用H3协议

  • 开启SNI白名单

故障现象:偶发性出现SNI deny错误。访问URLhttps://www.example.com,但TLS握手中携带的SNIworry.example.com

分析思路

排查SNI deny问题需要确认以下两点:

  • 确认客户端TLS握手中的ServerName是什么?——需要通过抓包分析

  • TLS握手中的ServerName与实际请求的URL地址是否一致?——需要解密HTTPS请求进行验证

解决方案

针对H3协议下的SNI deny问题,可以采用以下解决方案:

  1. 方案一:配置SNI白名单

    将所有可能出现在请求中的域名添加到SNI白名单中。包括主域名、子域名以及可能通过H3多路复用访问的所有域名。

  2. 方案二:关闭SNI白名单(不推荐)

    如果业务场景允许,可以关闭SNI白名单功能。但此方案会降低安全性,不建议在生产环境使用。

  3. 方案三:客户端配置优化

    确保客户端在发送请求时,TLS握手中的ServerNameHTTP请求的Host头保持一致,避免在同一QUIC连接上发送不同域名的请求。

相关参考

Mac系统中抓取HTTPS流量,可以通过指定sslkeylog.log文件到Wireshark中实现HTTPS解密。