You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache多域名虚拟主机SSL证书集中配置问题咨询

Apache多域名SSL证书集中配置方案

可以实现集中配置证书,无需在每个子域名虚拟主机中重复指定证书路径,以下是具体可行的方案:

1. 核心前提:启用SNI支持

确保你的Apache版本≥2.2.12(绝大多数现代发行版都满足),且已启用SNI(默认已开启,无需额外配置,除非编译时刻意禁用)。SNI是实现同一IP端口下多域名HTTPS的基础。

2. 方案一:使用mod_macro定义SSL模板(推荐)

通过mod_macro模块将SSL证书配置封装为模板,子域名仅需调用模板并指定个性化参数(如域名、网站根目录)即可,无需重复写证书路径。

步骤:

  1. 启用mod_macro:

    • Debian/Ubuntu系统:
      sudo a2enmod macro
      sudo systemctl restart apache2
      
    • RHEL/CentOS系统:
      在/etc/httpd/conf/httpd.conf中添加一行:
      LoadModule macro_module modules/mod_macro.so
      
      然后重启Apache:
      sudo systemctl restart httpd
      
  2. 创建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
    
  3. 验证配置并重启Apache:

    # 检查配置语法
    apachectl configtest
    # 重启服务
    systemctl restart apache2  # 或httpd
    

3. 方案二:拆分基础SSL配置与子域名配置

如果不想使用mod_macro,可将每个主域名的SSL配置单独放在基础文件中,子域名配置仅需开启SSL并指定个性化参数,无需重复证书路径(但需确保子域名与主域名的SSL配置在同一端口下正确匹配)。

示例:

  1. 创建主域名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>
    
  2. 创建子域名配置文件(/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:46:09