我在 Web 服务器配置文件中拥有以下格式的 VirtualHost 指令:
<VirtualHost *:443>
ServerName example.com
进入https://example.com
浏览器后,网站会正确呈现,流量是 TLS 加密的。我一将其重写为
<VirtualHost example.com:443>
向端口 443 上的域发送 GET 请求会导致 SSL 错误,即NET::ERR_CERT_COMMON_NAME_INVALID
在 Chrome 中,它说网络服务器提供了一个有效的证书example.net
(这个其他域仍然托管在我的服务器上)。
如果我查看证书(openssl x509 -in cert.pem -text
),我会发现它颁发给
Subject: CN=example.com
证书路径已正确配置。
附加信息:两个域在 hosts 文件中都解析为相同的 127.0.0.1,NameVirtualHost 未设置,并且在 Web 服务器前面有一个代理,希望这与此问题无关。
答案1
VirtualHost 指令的参数必须与定义的 NameVirtualHost 指令匹配。
如果您没有在配置中定义 NameVirtualHost domain.com,那么您不能在 VirtualHost 指令中使用 domain.com,因为它并不常用,* 或者 IP 通常用于 NameVirtualHost。
由于此 VirtualHost 无效,它会加载该 IP 上端口 443 的第一个或默认的 VirtualHost,即为您服务 SSL 的 anotherdomain.com。
答案2
我遇到了这个问题,我之前将我的应用程序放在内部 QA 域中,并拥有自己的证书。
当域名更新为永久域名时,我想设置从旧域名到新域名的重定向规则。
对我来说,解决方法是在重定向之前在虚拟主机中定义 QA SSL 证书:
#QA VHost
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/qa/server.crt
SSLCertificateKeyFile /etc/ssl/certs/qa/server.key
SSLCACertificateFile /etc/ssl/certs/qa/rsaca.crt
ServerName qa.internaldomain.com
Redirect / https://production.com/
</VirtualHost>
然后在相关虚拟主机中定义生产 SSL
# Prod VHost
<VirtualHost *:443>
ServerName production.com
DocumentRoot /http/production
SSLEngine on
SSLCertificateFile /etc/ssl/certs/production/server.crt
SSLCertificateKeyFile /etc/ssl/certs/production/server.key
SSLCACertificateFile /etc/ssl/certs/production/rsaca.crt
# other vhost configs ...
</VirtualHost>
显然,这仅当您拥有重定向域的有效证书时才有效,我想如果您没有,您可以随时使用像 certbot 这样的服务。