Apache - 多个 SSL 证书相互无效

Apache - 多个 SSL 证书相互无效

我在我们的一台服务器上为两个项目运行了两个 SSL 证书,其中一个是仅向该域颁发的通配符 SSL,我将其称为域名2.com域名1.com,另一个域名只向一个子域名发出域名,称为服务器

由于域2允许项目上的用户创建子域,它有一个如下所示的 VirtualHost 设置:

<VirtualHost *:443>
    <Directory /var/www/domain2>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    #There's a SSL redirection here -
    #stackexchange network detected it as a URL shortener, so removed from question
    SSLEngine on
    SSLCertificateFile /app/domain2/certs/domain2.com.pem
    SSLCertificateKeyFile /app/domain2/certs/domain2.com.key
    SSLCertificateChainFile "/app/domain2/certs/fullchain.pem"
    SSLCACertificatePath "/app/domain2/certs/"
    SSLCACertificateFile "/app/domain2/certs/cacert.pem"
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/domain2
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

这很好用,但是服务器.domain1.comSSL 不起作用(由 letsencrypt 颁发,domain2.com 由 AlphaSSL 颁发

<VirtualHost servers.domain1.com:443>
    <Directory /app/corporate/mediaserver/public>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    #There's a SSL redirection here -
    #stackexchange network detected it as a URL shortener, so removed from question
    SSLEngine on
    SSLCertificateFile /app/corporate/mediaserver/certs/[redacted]
    SSLCertificateKeyFile /app/corporate/mediaserver/certs/[redacted]
    SSLCACertificatePath /app/corporate/mediaserver/certs/[redacted]
    SSLCACertificateFile /app/corporate/mediaserver/certs/[redacted]
    ServerName servers.domain1.com
    ServerAdmin webmaster@localhost
    DocumentRoot /app/corporate/mediaserver/public
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

当我加载 servers.domain1.com 时,它会尝试从通配符加载 SSL,但是如果我将其设置<VirtualHost><VirtualHost domain1.com:443>并加载 domain1.com,它会从正确的 SSL 加载 SSL(servers.domain1.com 虚拟主机会被忽略)。

加载 servers.domain2.com (实际顶级域名为 .io)

答案1

首先: 中的参数<VirtualHost …>不是这样工作的。在“每个域一个 IP”系统中,它用于指定 Web 服务器将要使用的 IP 地址绑定到(即它将通过哪个地址接收连接)。它是不是用于根据 HTTP“主机:”或 TLS SNI 选择虚拟主机。

但是,您在评论中说您只有一个 IP 地址(因此您需要使用 TLS SNI)。在这种情况下全部虚拟主机块应绑定到同一个*地址,实际域名应指定为ServerName

第二:在 Apache 配置中,第一个匹配的 VirtualHost 块获胜。如果您有通配符ServerName 多于精确匹配,则将始终选择它。因此请确保您的 VirtualHosts 顺序正确。

# The specific subdomains go first...

<VirtualHost *:443>
    ServerName servers.domain1.com
    DocumentRoot /app/corporate/mediaserver/public
    SSLEngine on
    SSLCertificateFile /app/corporate/mediaserver/certs/fullchain.pem
    SSLCertificateKeyFile /app/corporate/mediaserver/certs/privkey.pem
</VirtualHost>

# ...and the wildcard is last:

<VirtualHost *:443>
    ServerName domain1.com
    ServerAlias *.domain1.com
    DocumentRoot /var/www/domain2
    SSLEngine on
    SSLCertificateFile /app/domain2/certs/fullchain.pem
    SSLCertificateKeyFile /app/domain2/certs/domain2.com.key
</VirtualHost>

(此SSLCertificateChainFile设置在 Apache 2.4 中已过时。这些SSLCA*设置适用于客户身份验证——如果您不使用它,您也不需要它们。)

相关内容