Apache单IP支持多个HTTPS域名依赖SNI机制:客户端TLS握手时明文发送域名,Apache据此匹配VirtualHost并加载对应证书;需满足Apache≥2.2.12、OpenSSL≥0.9.8f、mod_ssl启用,且每个VirtualHost必须独立配置SSLCertificateFile和SSLCertificateKeyFile。

Apache 单 IP 支持多个 HTTPS 域名,靠的是 SNI(Server Name Indication)机制——客户端在 TLS 握手初期就明文发送目标域名,Apache 据此匹配对应虚拟主机并加载专属证书。只要环境满足、配置规范,无需额外 IP 就能安全运行多个加密站点。
确认基础环境支持 SNI
这一步不能跳过,否则所有 HTTPS 请求都会 fallback 到第一个虚拟主机的证书:
- Apache ≥ 2.2.12(生产建议用 2.4.8+),运行
httpd -v查版本,再用httpd -M | grep ssl确认ssl_module已启用 - OpenSSL ≥ 0.9.8f(实际推荐 1.0.2 或 1.1.1+),执行
openssl version验证;旧版可能不支持 TLS 1.2/1.3 或 SNI 回调 - 检查
mod_ssl是否加载:Debian/Ubuntu 运行a2enmod ssl;RHEL/CentOS 确保LoadModule ssl_module modules/mod_ssl.so在httpd.conf中未被注释 - 注意客户端兼容性:IE6 on Windows XP、Android 2.x 等极旧系统不支持 SNI;现代浏览器、curl 7.18.1+、Java 7u25+ 均无问题
为每个域名准备独立证书文件
不能共用同一套证书路径,也不能把证书配置写在全局段落里。每个 <VirtualHost *:443> 必须显式声明自己的密钥对和证书链:
- 将每个域名的证书文件(如
fullchain.pem)、私钥(privkey.pem)分别存放在不同目录,例如:/etc/letsencrypt/live/site-a.com//etc/letsencrypt/live/site-b.com/ - 在对应虚拟主机中写入完整路径:
SSLCertificateFile /etc/letsencrypt/live/site-a.com/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/site-a.com/privkey.pem - Apache 2.4.8+ 可省略
SSLCertificateChainFile(因fullchain.pem已含中间证书);若用老版本或自签名证书,需补上该指令指向 chain 文件 - 切勿让 site-a.com 和 site-b.com 共用同一个
fullchain.pem,否则 SNI 匹配失效,用户访问 site-b.com 仍看到 site-a.com 的证书
编写清晰分离的虚拟主机配置
Apache 2.4 不再需要 NameVirtualHost *:443,但必须保证所有 HTTPS 虚拟主机都监听相同端口(通常是 *:443),并用 ServerName 明确标识域名:
- 把每个站点的配置单独写成文件(如
/etc/apache2/sites-available/site-a-ssl.conf),便于启停管理 - 每个
<VirtualHost *:443>块内必须包含:
–ServerName site-a.com(主域名)
–ServerAlias www.site-a.com(可选别名)
–DocumentRoot /var/www/site-a
– 完整 SSL 指令组(含证书路径、协议、加密套件) - 推荐启用强协议与现代加密套件:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 - 别忘了配置
<Directory>权限段,确保网站目录可被 Apache 访问(如Require all granted)
启用配置并验证生效
改完配置不是直接重启就完事,得逐层验证是否真正按预期工作:
- 先语法检查:
apachectl configtest或apache2ctl configtest,返回Syntax OK才继续 - 启用站点(Debian/Ubuntu):
a2ensite site-a-ssl.conf site-b-ssl.conf;RHEL/CentOS 直接确保配置文件被Include引入 - 重启服务:
systemctl restart apache2(Ubuntu)或systemctl restart httpd(CentOS) - 本地测试:
curl -I --resolve site-a.com:443:127.0.0.1 https://site-a.com,观察响应头是否含HTTP/2 200且无证书错误 - 线上验证:用 SSL Labs Test 输入域名,查看是否识别出正确证书、SNI 是否标记为 “Yes”、协议与密钥交换是否符合预期


















