apache中sni多域名ssl连接被重置,根本原因是客户端发送sni域名后,apache未能正确匹配虚拟主机或加载证书,导致tls握手中途断开;需检查mod_ssl加载、sni配置、servername匹配、证书链完整性及文件权限。
apache 中 sni 多域名 ssl 连接被重置,通常不是“连接被拒绝”,而是 tls 握手中途断开,表现为浏览器白屏、curl 报 ssl_error_syscall 或 connection reset by peer,甚至日志里只显示 [ssl:warn] [pid] ah01906: ... no certificate configured。根本原因在于客户端发了 sni 域名,但 apache 没能正确匹配到对应虚拟主机,或匹配后证书加载失败,最终触发底层连接重置。
检查 Apache 是否真正启用 SNI 支持
Windows 下的 phpEnv 或自编译 Apache 若缺失 OpenSSL 动态库,mod_ssl.so 会加载失败但不报错(仅日志提示 Cannot load mod_ssl.so),导致所有 HTTPS 请求被静默丢弃。确认方法:
- 打开
D:\phpEnv\Apache\conf\httpd.conf,确保未注释这两行:LoadModule ssl_module modules/mod_ssl.soInclude conf/extra/httpd-ssl.conf - 检查
D:\phpEnv\Apache\bin\目录下是否存在libcrypto-1_1-x64.dll和libssl-1_1-x64.dll(64位环境);缺失则从 Apache 官方二进制包补全 - 重启 Apache 后查看错误日志(
logs/error.log),确认无mod_ssl加载失败记录
验证 SNI 虚拟主机是否被正确识别
Apache 不会自动 fallback 到第一个 <virtualhost></virtualhost>,它要求每个域名必须有明确的 ServerName 匹配,且不能依赖 ServerAlias。常见错误包括:
- 在
httpd-vhosts.conf中漏写SSLEngine on—— 缺少该指令,整个块会被忽略 - 多个
<virtualhost></virtualhost>块共用同一组证书路径,或路径写错(如多了一个空格、反斜杠未转义、中文路径) - 未设置全局
SSLStrictSNIVHostCheck off(放在所有<virtualhost></virtualhost>外,如httpd-ssl.conf开头)—— 启用时,不带 SNI 的旧客户端(如 WinXP IE6)会直接断连 - 忘记添加
NameVirtualHost *:443(Apache 2.2 必需,2.4+ 已默认启用,但仍建议显式声明)
用 openssl 手动模拟 SNI 请求验证
绕过浏览器缓存和 DNS,直连并指定 SNI 域名,观察服务端响应:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
openssl s_client -connect 127.0.0.1:443 -servername site-a.test -showcerts
关键看输出:
- 若返回
verify error:num=20:unable to get local issuer certificate→ 说明证书链不完整,但 SNI 已生效 - 若返回
CONNECTED(00000003)后立即断开,且无证书信息 → SNI 未匹配到任何虚拟主机,Apache 默认关闭连接 - 若证书显示的是另一个域名(如 site-b.test 的证书),说明
ServerName写错或顺序错乱,Apache 用了 fallback 主机
再试另一个域名:openssl s_client -connect 127.0.0.1:443 -servername site-b.test,对比结果是否一致。
检查证书文件权限与格式一致性
Windows 下 Apache 以 SYSTEM 或 LocalService 身份运行,若证书私钥文件(.key)设置了用户独占读取权限,Apache 无法加载,就会静默失败:
- 右键私钥文件 → 属性 → 安全 → 编辑 → 添加
SYSTEM用户,并赋予“读取”权限 - 用记事本打开
.crt和.key,确认开头结尾为标准 PEM 格式:-----BEGIN CERTIFICATE-----/-----END CERTIFICATE----------BEGIN PRIVATE KEY-----/-----END PRIVATE KEY----- - 不要把
SSLCertificateChainFile指向根证书(CA.crt),应指向中间证书 + 根证书拼接后的完整链文件(即your_domain.crt+intermediate.crt)










