apache通过sni支持单ip多域名多证书,需满足apache≥2.2.12、openssl≥0.9.8j,启用mod_ssl与listen 443,每个独立配置servername及对应证书,全局设sslstrictsnivhostcheck off以兼容无sni请求。
apache 通过 sni(server name indication)支持单 ip 多域名、多 ssl 证书,前提是 apache 版本 ≥ 2.2.12、openssl ≥ 0.9.8j,且客户端支持 sni(现代浏览器、移动端基本都支持)。关键不是“开启 sni”,而是正确组织虚拟主机和证书配置。
确认基础环境已就绪
确保以下条件全部满足,否则 SNI 不会生效:
- Apache 运行的是 mod_ssl 模块:检查
httpd.conf中有未注释的LoadModule ssl_module modules/mod_ssl.so - 启用了 HTTPS 监听:存在
Listen 443(通常在httpd-ssl.conf或主配置中) - 使用的是 Apache 模式(非 Nginx):phpEnv 用户请右键托盘图标 → “切换 Web Server” → 选 Apache
- Windows 下需确认
libcrypto-1_1-x64.dll等 OpenSSL 动态库真实存在于Apache/bin/目录
为每个域名写独立的 *:443 虚拟主机块
SNI 要求每个域名对应一个明确的 <virtualhost></virtualhost> 定义,不能靠 ServerAlias 堆叠,也不能复用同一套证书文件。例如:
ServerName site-a.test
DocumentRoot "D:/www/site-a"
SSLEngine on
SSLCertificateFile "D:/ssl/site-a.crt"
SSLCertificateKeyFile "D:/ssl/site-a.key"
SSLCertificateChainFile "D:/ssl/site-a.chain"
Require all granted
ServerName site-b.test
DocumentRoot "D:/www/site-b"
SSLEngine on
SSLCertificateFile "D:/ssl/site-b.crt"
SSLCertificateKeyFile "D:/ssl/site-b.key"
SSLCertificateChainFile "D:/ssl/site-b.chain"
Require all granted
所有配置统一放在 httpd-vhosts.conf(或其 include 文件)末尾,避免被其他配置覆盖。
禁用严格 SNI 检查(可选但推荐)
在 <virtualhost></virtualhost> 外、全局上下文中添加一行:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
SSLStrictSNIVHostCheck off
这允许当客户端不发送 SNI 扩展时(极少数老旧设备),Apache 仍能 fallback 到第一个定义的 *:443 虚拟主机,避免直接报错断连。
证书链要向下兼容
单个 SSLCertificateChainFile 必须是完整、有序、向后兼容的中间链文件,例如:
- 第一行:你的域名证书(
site-a.crt) - 第二行:R3 或 ISRG Root X1 中间证书
- 第三行:DST Root CA X3(老客户端信任的关键交叉链)
不要把根证书(如 ISRG Root X1)直接放进链文件;Apache 不需要、也不应发送根证书。链文件只需保证从叶证书能回溯到客户端内置信任的锚点。










