curl自7.18.1起默认支持sni,但低版本或静态编译版(尤其windows旧二进制)可能因openssl
curl 默认从 7.18.1 版本起就支持 sni,但低版本 curl 或某些静态编译版本(尤其 windows 上的旧版二进制)可能禁用 openssl 的 sni 支持,导致连接 https 域名时 tls 握手失败、报错 ssl routines:ssl3_get_server_hello:wrong version number 或直接断开——本质是服务器因未收到 sni 扩展而拒绝协商,返回空响应或关闭连接。
要确认并解决 curl 不带 SNI 的问题,关键在验证 curl 自身能力 + 强制启用 SNI 行为 + 排除环境干扰:
-
检查 curl 是否真支持 SNI
运行:curl -V | grep -i openssl
输出中应含 OpenSSL 版本(如
OpenSSL/1.1.1w)。若显示none、mbedTLS、GnuTLS或 OpenSSL ✅ 正常支持 SNI 的典型输出:libcurl/7.81.0 OpenSSL/1.1.1w zlib/1.2.11 brotli/1.0.9 libidn2/2.3.2 -
强制指定 SNI 域名(绕过 DNS 解析歧义)
即使域名解析正常,curl 有时仍因 Host 头与 SNI 不一致失败。用--resolve显式绑定域名+IP,并确保请求 URL 使用该域名:curl --resolve 'example.com:443:192.168.1.100' https://example.com/ -v
此命令会强制 curl 在 TLS 握手时发送
example.com作为 SNI,同时把 DNS 查询覆盖为指定 IP,避免中间 DNS 或 hosts 干扰。
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
避免使用 IP 直连 HTTPS 地址
❌ 错误写法:curl https://192.168.1.100/
即使证书 SAN 包含example.com,curl 对 IP 地址不会发 SNI,后端无法选证,大概率握手失败。必须用域名发起请求。-
Windows 下特别注意运行库兼容性
若使用第三方打包的 curl(如 Git for Windows 自带),其 OpenSSL 可能被裁剪。建议:- 下载官方 curl.se 提供的
curl-xxx-openssl-msvc.zip版本 - 确保解压目录中存在
libcrypto-1_1-x64.dll和libssl-1_1-x64.dll - 运行前检查 DLL 能被加载:
curl -V不报Failed to load library类错误
- 下载官方 curl.se 提供的
-
测试 SNI 是否真正生效
用 OpenSSL 命令直连验证(比 curl 更底层):openssl s_client -connect example.com:443 -servername example.com -showcerts
若返回有效证书且
Server name行显示example.com,说明 SNI 已通;若报SSL routines::no suitable signature algorithm或无证书输出,说明服务端或链路阻断了 SNI。
SNI 是客户端行为,Apache 或 Nginx 等服务端无需为此修改配置——只要它启用了 SNI(现代 Apache 默认开启),问题就出在 curl 本身或调用方式上。










