核心是为每个<VirtualHost *:443>块独立配置SSLCertificateFile、SSLCertificateKeyFile及ServerName,并启用SNI支持,确保证书域名匹配、私钥权限为600、模块已加载,最后通过configtest验证并重载服务。

Linux 中为多个虚拟主机配置独立 SSL 证书,核心是让每个 VirtualHost 绑定自己的证书文件,且监听 443 端口时使用各自的 SSLCertificateFile 和 SSLCertificateKeyFile。Apache 支持基于 SNI(Server Name Indication)的多域名 HTTPS,只要客户端支持(现代浏览器均支持),就能正确分发证书。
确认环境与模块已启用
确保 Apache 已安装并启用了 mod_ssl,且 OpenSSL 可用:
- Debian/Ubuntu:
sudo a2enmod ssl && sudo systemctl restart apache2 - CentOS/RHEL:
sudo yum install mod_ssl openssl(通常随 httpd 安装,默认已加载) - 验证命令:
apache2ctl -M | grep ssl或httpd -M | grep ssl,应看到ssl_module (shared)
为每个域名准备独立证书文件
每个虚拟主机需有专属的三件套(路径建议统一管理,如 /etc/ssl/sites/example.com/):
-
example.com.crt:该域名的公钥证书(由 CA 签发) -
example.com.key:对应私钥(权限必须为600,sudo chmod 600 /etc/ssl/sites/example.com/*.key) -
example.com.ca-bundle(可选):中间证书链,用于补全信任链;若无,可省略或合并进 crt 文件
注意:不同域名的私钥绝对不能混用,证书也必须与域名完全匹配(含 www 与非 www)。
分别配置独立的 SSL 虚拟主机
在 /etc/apache2/sites-available/(Debian)或 /etc/httpd/conf.d/(RHEL)下,为每个站点创建独立配置文件,例如:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/ssl/sites/example.com/example.com.crt
SSLCertificateKeyFile /etc/ssl/sites/example.com/example.com.key
SSLCertificateChainFile /etc/ssl/sites/example.com/example.com.ca-bundle
<Directory "/var/www/example">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName blog.example.com
DocumentRoot /var/www/blog
SSLEngine on
SSLCertificateFile /etc/ssl/sites/blog.example.com/blog.example.com.crt
SSLCertificateKeyFile /etc/ssl/sites/blog.example.com/blog.example.com.key
</VirtualHost>
</IfModule>
每个 <VirtualHost *:443> 块相互隔离,互不影响。Apache 会根据 TLS 握手时客户端发送的 SNI 主机名,自动选择对应证书。
补充 HTTP 强制跳转与测试
为每个域名添加对应的 80 端口重定向,避免用户手动输入 http:
- 新增
<VirtualHost *:80>块,用Redirect permanent / https://example.com/或RewriteRule实现 301 跳转 - 启用站点(Debian):
sudo a2ensite example.com.conf blog.example.com.conf - 语法检查:
sudo apache2ctl configtest或sudo httpd -t - 重启服务:
sudo systemctl reload apache2或sudo systemctl restart httpd - 浏览器访问
https://example.com和https://blog.example.com,确认地址栏显示锁图标且证书信息匹配各自域名
不复杂但容易忽略


















