使用 SNI 的 Apache SSL 虚拟主机忽略 ServerName

使用 SNI 的 Apache SSL 虚拟主机忽略 ServerName

我想为启用 SNI 的客户端发送错误的主机名 400 Bad Request,但在这种情况下 Apache 始终为默认虚拟主机提供服务。我无法添加发送 400 Bad Request 状态的默认虚拟主机,因为禁用 SNI 的客户端将始终获得此虚拟主机。

似乎服务器名称当我在启用 SNI 的 Apache 安装上启用基于名称的虚拟主机时,禁用 SNI 的客户端将忽略虚拟主机指令。

查看以下虚拟主机配置:

NameVirtualHost 192.168.4.46:443
<VirtualHost 192.168.4.46:443>
        ServerName 192.168.4.46
        DocumentRoot /var/www/error-page/

        SSLEngine on
        SSLCertificateFile /path/to/certificate.crt
        SSLCertificateKeyFile /path/to/certificate.key
</VirtualHost>
<VirtualHost 192.168.4.46:443>
        ServerName test-ssl
        DocumentRoot /var/www/valid-website/

        SSLEngine on
        SSLCertificateFile /path/to/certificate.crt
        SSLCertificateKeyFile /path/to/certificate.key
</VirtualHost>

如果我使用禁用 SNI 的客户端,我将收到错误页面不管主持人:我在请求中发送的标头。因为我在两个虚拟主机中使用相同的证书,所以我希望禁用 SNI 的客户端能够根据与服务器名称

如果我切换虚拟主机的位置,该网站将成为默认虚拟主机,然后是 SNI-已启用如果客户输入了错误的主持人:在标题中。

那么基本上,我如何让 Apache 为每个错误提供错误主持人:无论是否支持 SNI,都可以使用标头,同时在使用禁用 SNI 的客户端时仍可为网站提供服务,并提供正确的启用 SNI 的客户端时是否使用虚拟主机?

答案1

我认为最简短的答案是:

MOD_重写

设置一个条件来检查主机头;如果不正确,则将请求转发到错误页面。

您的非错误站点将是默认站点,并且重写规则将存在于此虚拟主机中。


如果确实有“更短/更简单”的选项,我怀疑这个选项将为如何处理请求提供清晰的逻辑。此解决方案假设您想要全部无论 SNI 状态如何,请求都会为给定的虚拟主机提供匹配的主机头。

答案2

删除要在错误模式下使用的虚拟主机中的 ServerName。它应该有效

相关内容