核心是启用SNI技术:需Apache≥2.2.12且编译支持OpenSSL、mod_ssl已启用、每个VirtualHost独立配置证书与私钥、禁用全局SSL配置、SSLStrictSNIVHostCheck设为off以兼容老旧客户端。

要实现在单IP上用Apache托管多个HTTPS站点,核心就是启用SNI(Server Name Indication)技术。它让服务器在TLS握手阶段根据客户端声明的域名,动态选择对应证书,从而避免“所有HTTPS请求都返回第一个站点证书”的常见问题。
确认基础环境支持
不是配了就能用,得先确保底层条件满足:
- Apache版本 ≥ 2.2.12(强烈建议 ≥ 2.4.8),运行
httpd -V | grep -i ssl查看是否编译进 OpenSSL 支持 - mod_ssl 模块已启用:Debian/Ubuntu 执行
a2enmod ssl;CentOS/RHEL 检查LoadModule ssl_module modules/mod_ssl.so是否在配置中取消注释 - 操作系统 OpenSSL 版本 ≥ 0.9.8j(现代系统基本都满足)
每个站点必须独占证书与私钥
SNI生效的前提是“按域名隔离证书”。不能共用 SSLCertificateFile 或 SSLCertificateKeyFile,哪怕两个域名同属一个组织。
- 为 site-a.com 单独申请或生成证书,路径如:
/etc/ssl/certs/site-a.com.crt和/etc/ssl/private/site-a.com.key - 为 site-b.com 单独申请或生成证书,路径如:
/etc/ssl/certs/site-b.com.crt和/etc/ssl/private/site-b.com.key - 若用 Let’s Encrypt,推荐分别运行:
certbot --apache -d site-a.com -d www.site-a.com和certbot --apache -d site-b.com -d www.site-b.com,避免混用 fullchain.pem
正确编写虚拟主机配置
所有 SSL 配置必须写在 块内部,禁用全局 ssl.conf 中的证书路径设置。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Apache 2.4+ 不需要
NameVirtualHost *:443(该指令已废弃) - 每个
必须包含完整 SSL 设置,示例如下:
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site-a.com.crt
SSLCertificateKeyFile /etc/ssl/private/site-a.com.key
SSLCertificateChainFile /etc/ssl/certs/site-a.com.ca-bundle
ServerName site-a.com
ServerAlias www.site-a.com
DocumentRoot /var/www/site-a
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site-b.com.crt
SSLCertificateKeyFile /etc/ssl/private/site-b.com.key
SSLCertificateChainFile /etc/ssl/certs/site-b.com.ca-bundle
ServerName site-b.com
ServerAlias www.site-b.com
DocumentRoot /var/www/site-b
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL
处理老旧客户端兼容性
部分旧设备(如 IE6 on Windows XP、Android 2.x)不支持 SNI,连接时无法发送域名信息。
- Apache 默认行为是
SSLStrictSNIVHostCheck off(2.2.12+ 已默认关闭),此时无SNI请求会 fallback 到配置中第一个的证书 - 该指令必须放在
外部(如 ssl.conf 全局段),不可写在某个虚拟主机内 - 若明确不需要兼容老设备,可设为
on,但需监控 TLS handshake failure 日志,避免误伤真实用户










