Apache支持单IP多HTTPS域名的关键是启用SNI,需满足Apache≥2.2.12(推荐≥2.4.8)、OpenSSL≥0.9.8f、mod_ssl启用、Listen 443配置,并为每个域名配置独立证书与私钥及专属<VirtualHost *:443>块。
apache 支持单 ip 多 https 域名,关键在于启用 sni(server name indication)——它让客户端在 tls 握手初期明文发送目标域名,服务器据此加载对应证书。配置本身不难,但漏掉任一环节,所有域名都会返回第一个虚拟主机的证书。
确认运行环境满足 SNI 前提
不是装了 Apache 就能用 SNI,必须同时满足:
- Apache ≥ 2.2.12(生产环境建议 ≥ 2.4.8):执行 httpd -V | grep -i version 查看
- OpenSSL ≥ 0.9.8f(推荐 ≥ 1.1.1):运行 httpd -V | grep -i ssl,输出中需含 OpenSSL 版本号;若显示 BoringSSL 或无输出,说明未正确链接 OpenSSL
- mod_ssl 模块已启用:Debian/Ubuntu 执行 a2enmod ssl && systemctl restart apache2;RHEL/CentOS 检查 httpd.conf 中 LoadModule ssl_module modules/mod_ssl.so 是否取消注释
- 系统已声明监听 443 端口:确保 ports.conf 或主配置中有 Listen 443
为每个域名准备独立证书与私钥
SNI 要求“按域名隔离 SSL 上下文”,不能共用、不能混放、不能写在全局配置里:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 为 site-a.com 单独申请或生成证书,例如:
/etc/ssl/certs/site-a.com.crt(或 fullchain.pem)、
/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
避免跨域名复用同一组证书文件
编写正确的 HTTPS 虚拟主机配置
Apache 2.4 不再需要 NameVirtualHost *:443,直接定义多个 <VirtualHost *:443> 即可。每个块必须完整、独立:
- 每块内必须包含:SSLEngine on、ServerName(精确匹配,如 site-a.com ≠ www.site-a.com)、SSLCertificateFile、SSLCertificateKeyFile
- 推荐添加 ServerAlias 覆盖常用变体(如 www 子域)
- 证书链处理:若用 Let’s Encrypt 的 fullchain.pem,设为 SSLCertificateFile /path/to/fullchain.pem;私钥为 SSLCertificateKeyFile /path/to/privkey.pem
- 安全加固建议(放在全局或 <IfModule mod_ssl.c> 块中):
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
验证 SNI 是否生效
配置完成后重启 Apache,再用命令行验证实际响应的证书是否按域名区分:
- 检查 site-a.com:
openssl s_client -connect site-a.com:443 -servername site-a.com 2>/dev/null | openssl x509 -noout -text | grep "Subject:" - 检查 site-b.com:
openssl s_client -connect site-b.com:443 -servername site-b.com 2>/dev/null | openssl x509 -noout -text | grep "Subject:" - 两行输出中的 CN 或 SAN 应分别对应各自域名
- 浏览器访问时,地址栏锁图标点击后查看证书详情,确认显示的是该域名专属证书

















