关键在于为每个块单独指定证书、私钥及证书链路径,确保ServerName与证书域名完全匹配,并正确设置文件权限与Apache模块启用,最后通过configtest验证并重载服务。
为 Apache 单个虚拟主机配置单独的 SSL 证书,关键在于让该站点独享一套证书文件,并与其他站点隔离,避免证书冲突或路径混用。这在多域名、多客户共用一台服务器时尤其常见。
Apache 2.2.12+ 默认支持 SNI(Server Name Indication),允许多个 HTTPS 虚拟主机共用 443 端口但使用不同证书。需确保:
httpd -v 或 apache2 -v,版本不低于 2.2.12(推荐 2.4.8+)apachectl -M | grep ssl,输出含 ssl_module (shared)
sudo a2enmod ssl 或确认 LoadModule ssl_module modules/mod_ssl.so 已在主配置中取消注释不要复用其他站点的证书。为当前域名生成或获取独立证书包(如 Let’s Encrypt 的 certbot --cert-name example.com),确保包含:
example.com.crt 或 fullchain.pem)example.com.key,权限严格设为 600)chain.pem;若用 Let’s Encrypt,fullchain.pem 已含链,可不单独配 SSLCertificateChainFile)统一存入专属目录,例如:/etc/httpd/ssl/example.com/(CentOS)或/etc/ssl/certs/example.com/(Ubuntu)
<virtualhost></virtualhost> 块在站点专属配置文件中(如 /etc/httpd/conf.d/example.com.conf),写明完整 HTTPS 配置,**不与其他站点混用同一 <virtualhost></virtualhost> 块**:
<VirtualHost *:443> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example.com<pre class="brush:php;toolbar:false;">SSLEngine onSSLCertificateFile /etc/httpd/ssl/example.com/example.com.crtSSLCertificateKeyFile /etc/httpd/ssl/example.com/example.com.keySSLCertificateChainFile /etc/httpd/ssl/example.com/chain.pem# 推荐加固(可选)SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
注意:ServerName 必须与证书中 Subject 或 SAN 字段完全匹配,否则浏览器会报“证书不匹配”警告。
在同一配置文件中补充 80 端口重定向,确保用户始终走加密连接:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect permanent / https://example.com/</VirtualHost>
完成后,检查语法:sudo apachectl configtest,无误则重启服务:sudo systemctl restart httpd(或 apache2)。