我正在从 Virtualhost 加载通配符子域的 SSL 文件,但第二个虚拟主机加载了第一个虚拟主机的 SSL 文件,浏览器报告了无效证书错误
这是配置
<VirtualHost *:443>
ServerName cert-1.domain.com
ServerAlias cert-1.domain.com,*.net.domain.com
DocumentRoot /home/myuser/public_html
ServerAdmin [email protected]
UseCanonicalName Off
<IfModule mod_suphp.c>
suPHP_UserGroup myuser myuser
</IfModule>
<IfModule suexec_module>
<IfModule !mod_ruid2.c>
SuexecUserGroup myuser myuser
</IfModule>
</IfModule>
<IfModule ssl_module>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cert-1.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cert-1.domain.com/privkey.pem
</IfModule>
</VirtualHost>
<VirtualHost *:443>
ServerName cert-2.domain.com
ServerAlias cert-2.domain.com,*.org.domain.com
DocumentRoot /home/myuser/public_html
ServerAdmin [email protected]
UseCanonicalName Off
<IfModule mod_suphp.c>
suPHP_UserGroup myuser myuser
</IfModule>
<IfModule suexec_module>
<IfModule !mod_ruid2.c>
SuexecUserGroup myuser myuser
</IfModule>
</IfModule>
<IfModule ssl_module>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cert-2.domain.com-2/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cert-2.domain.com-2/privkey.pem
</IfModule>
</VirtualHost>
但是当我访问 anything.org.domain.com 时,它会加载第一个虚拟主机的 SSL 文件,而不是第二个虚拟主机的 SSL 文件,
即使我尝试使用不在第一个或第二个虚拟主机中的子域,它仍然会加载第一个虚拟主机 SSL 文件,并且浏览器会抛出无效的 SSL 错误。
我该如何解决这个问题,
谢谢
答案1
服务器别名应该用空格分隔,而不是逗号,因此您的ServerAlias
行应该如下所示:
ServerAlias cert-1.domain.com *.net.domain.com
请注意,可以在单个块中给出更多ServerAlias
指令,这使得在存在许多别名的情况下配置更具可读性。
如果您请求一个不存在明确配置的主机,Apache 将提供它找到的第一个块(这就是为什么最好在最后一个位置包含一个VirtualHost
块ServerAlias *
,以拥有一个“包罗万象”的站点)。
因此,对于您的情况,所有行都ServerAlias
不起作用(无论如何都不像您期望的那样),因为您正在为服务器定义一个别名,该服务器的名称为“cert-2.domain.com,*.org.domain.com”,带有逗号、星号等。为此,当您请求“anything.org.domain.com”时,Apache 会提供它遇到的第一个块,因为此主机名未在配置中定义。