Apache多域名虚拟主机SSL证书集中配置问题咨询
Apache多域名SSL证书集中配置方案
可以实现集中配置证书,无需在每个子域名虚拟主机中重复指定证书路径,以下是具体可行的方案:
1. 核心前提:启用SNI支持
确保你的Apache版本≥2.2.12(绝大多数现代发行版都满足),且已启用SNI(默认已开启,无需额外配置,除非编译时刻意禁用)。SNI是实现同一IP端口下多域名HTTPS的基础。
2. 方案一:使用mod_macro定义SSL模板(推荐)
通过mod_macro模块将SSL证书配置封装为模板,子域名仅需调用模板并指定个性化参数(如域名、网站根目录)即可,无需重复写证书路径。
步骤:
启用mod_macro:
- Debian/Ubuntu系统:
sudo a2enmod macro sudo systemctl restart apache2 - RHEL/CentOS系统:
在/etc/httpd/conf/httpd.conf中添加一行:
然后重启Apache:LoadModule macro_module modules/mod_macro.sosudo systemctl restart httpd
- Debian/Ubuntu系统:
创建SSL模板配置文件(如
/etc/httpd/conf.d/macro-ssl.conf):<Macro SSLDomain $domain $cert $key $docroot> <VirtualHost *:443> ServerName $domain SSLEngine On # 证书路径仅需在模板中定义一次 SSLCertificateFile $cert SSLCertificateKeyFile $key # 个性化网站根目录 DocumentRoot $docroot # 可添加通用SSL安全配置(按需调整) SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:!aNULL:!MD5 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost> </Macro> # 配置主域名及www子域名 Use SSLDomain a.com /path/fullchain-a.pem /path/privkey-a.pem /var/www/html-a-main Use SSLDomain www.a.com /path/fullchain-a.pem /path/privkey-a.pem /var/www/html-a-main Use SSLDomain b.com /path/fullchain-b.pem /path/privkey-b.pem /var/www/html-b-main Use SSLDomain www.b.com /path/fullchain-b.pem /path/privkey-b.pem /var/www/html-b-main # 配置自定义子域名 Use SSLDomain subdomain.b.com /path/fullchain-b.pem /path/privkey-b.pem /var/www/html-b Use SSLDomain subdomain.a.com /path/fullchain-a.pem /path/privkey-a.pem /var/www/html-a Use SSLDomain test.a.com /path/fullchain-a.pem /path/privkey-a.pem /var/www/shared-html Use SSLDomain test.b.com /path/fullchain-b.pem /path/privkey-b.pem /var/www/shared-html验证配置并重启Apache:
# 检查配置语法 apachectl configtest # 重启服务 systemctl restart apache2 # 或httpd
3. 方案二:拆分基础SSL配置与子域名配置
如果不想使用mod_macro,可将每个主域名的SSL配置单独放在基础文件中,子域名配置仅需开启SSL并指定个性化参数,无需重复证书路径(但需确保子域名与主域名的SSL配置在同一端口下正确匹配)。
示例:
创建主域名SSL基础配置(
/etc/httpd/conf.d/ssl-main.conf):# a.com主域名及默认SSL配置 <VirtualHost *:443> ServerName a.com ServerAlias www.a.com SSLEngine On SSLCertificateFile /path/fullchain-a.pem SSLCertificateKeyFile /path/privkey-a.pem DocumentRoot /var/www/html-a-main </VirtualHost> # b.com主域名及默认SSL配置 <VirtualHost *:443> ServerName b.com ServerAlias www.b.com SSLEngine On SSLCertificateFile /path/fullchain-b.pem SSLCertificateKeyFile /path/privkey-b.pem DocumentRoot /var/www/html-b-main </VirtualHost> # 可选:为未配置的子域名设置fallback <VirtualHost *:443> ServerName *.a.com SSLEngine On SSLCertificateFile /path/fullchain-a.pem SSLCertificateKeyFile /path/privkey-a.pem DocumentRoot /var/www/html-a-fallback </VirtualHost> <VirtualHost *:443> ServerName *.b.com SSLEngine On SSLCertificateFile /path/fullchain-b.pem SSLCertificateKeyFile /path/privkey-b.pem DocumentRoot /var/www/html-b-fallback </VirtualHost>创建子域名配置文件(
/etc/httpd/conf.d/subdomains.conf):# 子域名需开启SSLEngine,证书参数会通过SNI自动匹配对应主域名的配置 <VirtualHost *:443> ServerName subdomain.a.com SSLEngine On DocumentRoot /var/www/html-a </VirtualHost> <VirtualHost *:443> ServerName subdomain.b.com SSLEngine On DocumentRoot /var/www/html-b </VirtualHost> <VirtualHost *:443> ServerName test.a.com ServerAlias test.b.com SSLEngine On DocumentRoot /var/www/shared-html </VirtualHost>注意:此方案中,
test.b.com会使用b.com的证书,因为SNI会根据请求的Host头匹配对应的证书。如果需要test.b.com使用其他证书,需单独配置证书路径。
4. 关键注意事项
- 避免通配符ServerAlias覆盖精确子域名:不要在主域名的VirtualHost中添加
*.a.com这类通配符别名,否则Apache会优先匹配通配符,导致精确子域名的配置不生效。如需fallback,单独创建通配符VirtualHost即可。 - 检查虚拟主机配置:使用
apachectl -S命令查看虚拟主机列表,确认每个子域名都有精确匹配的条目,且证书配置正确。 - 默认虚拟主机:每个IP:端口组合只能有一个默认虚拟主机,多个默认配置只有第一个生效是正常行为,无需设置多个。
内容的提问来源于stack exchange,提问作者Adammantium
相关产品推荐
相关产品推荐

