我在我们的一台服务器上为两个项目运行了两个 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 虚拟主机会被忽略)。
答案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*
设置适用于客户身份验证——如果您不使用它,您也不需要它们。)