Apache支持多域名SSL证书的核心是SNI技术,需版本≥2.2.12(推荐≥2.4.8),通过为每个块独立配置SSLCertificateFile与SSLCertificateKeyFile实现证书隔离,确保ServerName与证书SAN完全匹配,并正确设置权限、启用mod_ssl及443端口,最后验证生效。

Apache 支持在一个服务器上为多个域名部署 SSL 证书,核心依赖 SNI(Server Name Indication) 技术。只要 Apache 版本 ≥ 2.2.12(推荐 ≥ 2.4.8),且操作系统和客户端支持 SNI(现代浏览器均支持,仅极老旧系统如 Windows XP + IE6 不兼容),就能安全、独立地为每个域名配置专属证书。
✅ 多域名证书的两种实现方式
方式一:单个证书含多个域名(SAN 证书)
一张证书里包含多个域名(如example.com、www.example.com、api.example.com、blog.other.com),所有域名共用同一套证书文件(.crt+.key+ 中间链)。适合域名数量固定、管理简洁的场景。方式二:每个域名配独立证书(SNI 虚拟主机)
每个<virtualhost></virtualhost>块中单独指定SSLCertificateFile和SSLCertificateKeyFile,证书互不干扰。适合混合主域、子域、甚至完全无关域名(如site-a.com和site-b.net)共存的生产环境。
⚠️ 注意:通配符证书(如
*.example.com)只覆盖一级子域(www.example.com、shop.example.com),不覆盖根域example.com或二级子域dev.prod.example.com;若需覆盖,必须显式加入 SAN 列表或另配证书。
? 配置步骤(以方式二为例)
1. 准备证书文件
为每个域名分别准备三类文件,建议按域名归类存放:
/etc/ssl/certs/example.com.crt # 域名证书 /etc/ssl/private/example.com.key # 私钥(权限设为 600) /etc/ssl/certs/example.com.chain # 中间证书链(可选,但推荐)
重复操作,准备好 site-b.net.crt、site-b.net.key 等。
2. 启用 SSL 模块与端口
确保已启用模块并开放 443 端口:
sudo a2enmod ssl # Ubuntu/Debian # 或 sudo systemctl enable httpd && sudo systemctl start httpd # CentOS
确认防火墙放行:
sudo ufw allow 443 # Ubuntu sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload # CentOS
3. 编写独立的 HTTPS 虚拟主机配置
在 /etc/apache2/sites-available/(Ubuntu)或 /etc/httpd/conf.d/(CentOS)下,为每个域名新建 .conf 文件,例如:
/etc/apache2/sites-available/example.com-ssl.conf
<ifmodule mod_ssl.c><virtualhost>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.chain
# 强制 TLS 1.2+,禁用弱协议
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...
SSLHonorCipherOrder on
SSLCompression off
</virtualhost></ifmodule>
/etc/apache2/sites-available/site-b.net-ssl.conf
<ifmodule mod_ssl.c><virtualhost>
ServerName site-b.net
ServerAlias www.site-b.net
DocumentRoot /var/www/site-b.net
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site-b.net.crt
SSLCertificateKeyFile /etc/ssl/private/site-b.net.key
SSLCertificateChainFile /etc/ssl/certs/site-b.net.chain
# 其他 SSL 设置同上(可复用)
</virtualhost></ifmodule>
✅ 提示:
SSLCertificateChainFile在 Apache 2.4.8+ 可合并进SSLCertificateFile(即把中间证书追加到域名证书末尾),但分开写更清晰易维护。
4. 启用站点并重启
# Ubuntu sudo a2ensite example.com-ssl.conf site-b.net-ssl.conf sudo systemctl reload apache2 # CentOS sudo systemctl reload httpd
? 验证是否生效
- 浏览器访问
https://example.com和https://site-b.net,地址栏显示锁图标 ✅ - 使用命令行检查:
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text | grep "Subject:" openssl s_client -connect site-b.net:443 -servername site-b.net | openssl x509 -noout -text | grep "Subject:"
确保返回的 CN 或 SAN 字段匹配对应域名。
❗ 常见问题速查
-
浏览器提示“证书不匹配” → 检查
ServerName是否与证书 SAN 列表完全一致(区分 www/非www) -
HTTPS 打不开或 503 → 查看 Apache 错误日志:
sudo tail -f /var/log/apache2/error.log,常见原因是私钥权限不对(应为600)或路径写错 - 部分旧设备打不开 HTTPS → 确认是否启用了 SNI(Apache 默认开启),若需兼容 WinXP/IE6,只能改用单证书 + 多域名(SAN)方案
不复杂但容易忽略











