Apache配置SNI需满足:版本≥2.2.12且编译支持OpenSSL(httpd -V | grep -i ssl验证),mod_ssl已启用;每个VirtualHost必须独立配置SSLCertificateFile和SSLCertificateKeyFile,禁止全局共用;ServerName须精确匹配SNI域名;SSLStrictSNIVHostCheck off可兼容无SNI旧客户端。

确认基础环境是否满足SNI要求
Apache必须 ≥2.2.12,且编译时启用了OpenSSL支持。运行 httpd -V | grep -i ssl 查看输出中是否有 OpenSSL 版本信息;若显示 BoringSSL 或无任何输出,说明不满足条件。同时确保 mod_ssl 已启用:Debian/Ubuntu 系统执行 a2enmod ssl,CentOS/RHEL 检查配置文件中是否存在 LoadModule ssl_module modules/mod_ssl.so 并已取消注释。
每个站点必须独立配置证书与私钥
不能在全局 ssl.conf 中统一写 SSLCertificateFile,所有 SSL 配置必须放在各自的
- 站点 A:SSLCertificateFile /etc/ssl/certs/site-a.com.crt + SSLCertificateKeyFile /etc/ssl/private/site-a.com.key
- 站点 B:SSLCertificateFile /etc/ssl/certs/site-b.net.crt + SSLCertificateKeyFile /etc/ssl/private/site-b.net.key
哪怕两个域名同属一个组织,也禁止共用同一组证书文件——否则 SNI 失效,所有请求都会拿到第一个虚拟主机的证书。
正确编写 VirtualHost 配置
Apache 2.4 不再需要 NameVirtualHost *:443,直接定义带域名和端口的块即可:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<VirtualHost *:443>
ServerName site-a.com
ServerAlias www.site-a.com
DocumentRoot /var/www/site-a
SSLCertificateFile /etc/ssl/certs/site-a.com.crt
SSLCertificateKeyFile /etc/ssl/private/site-a.com.key
# 其他 SSL 设置(如 SSLProtocol、SSLCipherSuite)建议统一放在外部段
</VirtualHost>
<p><VirtualHost *:443>
ServerName site-b.net
ServerAlias www.site-b.net
DocumentRoot /var/www/site-b
SSLCertificateFile /etc/ssl/certs/site-b.net.crt
SSLCertificateKeyFile /etc/ssl/private/site-b.net.key
</VirtualHost>注意:ServerName 必须精确匹配客户端 TLS 握手时发送的 SNI 域名,大小写不敏感但拼写必须一致。
处理老旧客户端兼容性问题
部分旧设备(如 IE6 on Windows XP、Android 2.x)不发 SNI 字段,会导致证书错配。Apache 默认行为是 fallback 到第一个
SSLStrictSNIVHostCheck off
该指令设为 off 后,无 SNI 请求会由第一个定义的 HTTPS 虚拟主机响应(可能证书不匹配但连接可建立);设为 on 则直接拒绝连接。生产环境普遍采用 off,并配合日志监控异常 TLS handshake failure。

















