禁用 Apache 上特定虚拟主机的 SNI

禁用 Apache 上特定虚拟主机的 SNI

我们有一个具有几个互联网 IP 的网络服务器。

我已经成功设置了基于 SNI 名称的虚拟主机,它运行良好。但我想做的是让我们的主站点不使用 SNI,而只使用其中一个唯一 IP 地址,以便改进我们对该站点的浏览器支持(XP/IE 组合...)

我们运营着一个非常受欢迎的网站,该网站有大量用户运行着严重过时的浏览器,因此这对我们来说非常重要。

在 CentOS 6 上运行 Apache 2.2(2.2.15-47.el6_7)。

答案1

正如其他人所说,只需将第一个站点作为第一个虚拟主机,无论是否启用 SNI,它都可以工作:

<VirtualHost *:443>

   ServerName www.site1.com

   DocumentRoot /site1/

   SSLCertificateKeyFile /ssl/server1.key
   SSLCertificateFile /ssl/server1.crt

</VirtualHost>

<VirtualHost *:443>

   ServerName www.site2.com

   DocumentRoot /site2/

   SSLCertificateKeyFile /ssl/server2.key
   SSLCertificateFile /ssl/server2.crt

</VirtualHost>

但是,站点 2 的非 SNI 浏览器将获得站点 1 的证书,因此会出现错误(并且用户可能会想知道为什么他们会获得不同站点的证书,但如果仍然使用非 SNI 浏览器,他们可能不那么精通技术)。

然而,可以提供访问全部用户全部您的网站,尽管存在明显的 SNI 问题,但如果您拥有一个涵盖所有站点主题备用名称字段的单一证书。

然后,您可以拥有两个使用相同密钥和证书的虚拟主机:

<VirtualHost *:443>

   ServerName www.site1.com

   DocumentRoot /site1/

   SSLCertificateKeyFile /ssl/server.key
   SSLCertificateFile /ssl/server.crt

</VirtualHost>

<VirtualHost *:443>

   ServerName www.site2.com

   DocumentRoot /site2/

   SSLCertificateKeyFile /ssl/server.key
   SSLCertificateFile /ssl/server.crt

</VirtualHost>

因此,您对两个站点(或三个,或更多,如果您愿意)拥有相同的密钥和证书。

因此,即使没有 SNI 支持,www.site1.com 也始终是默认主机。

对于 www.site2.com 来说,情况变得更有趣:

  • 对于支持 SNI 的浏览器,它们提供服务器名称并直接转到 site2 虚拟主机配置,这样就可以了。
  • 对于不支持 SNI 的浏览器,它们默认使用 site1 配置,该配置返回其证书,但由于该证书适用于两个站点,因此这实际上没问题。 SSL 协商完成后,第一个 Web 请求进入,但由于此时服务器被赋予了服务器名称,因此它可以正确地从 /site2/ 目录提供文档。

因此,这是可行的,因为 https 连接涉及两个不同且不相关的步骤:1)进行 SSL 协商和 2)使用该 SSL 连接请求文档,并且这两个步骤不必来自同一个虚拟主机(尽管大多数人认为确实如此)。

此选项的主要缺点是,根据网站之间的密切关系,在同一证书上有两个不同的 URL 可能看起来不专业。但是,如果他们共享一个主机,那么他们可能是有一定关联的企业(除非服务器归托管公司所有),所以这可能不是问题。

我发现这是一个方便的小解决方法,特别是对于开发服务器,我可能希望在一个 IP 地址上托管多个站点,我在主题备用名称字段中使用带有多个 URL 的自签名分。

答案2

您无法在服务器端“禁用” SNI —— 您甚至无法控制客户端是否发送扩展。您所能做的就是定义服务器如何响应 SNI 信息的存在(或不存在)。

通常,当服务器收到缺少 SNI 信息的请求时,它会选择其中一个可用的证书来呈现给客户端。对于 Apache,它将是正在监听的地址/端口对的第一个虚拟主机。

至于是否要为您希望在没有 SNI 的情况下安全访问的站点设置单独的“非 SNI”地址,我认为这并不重要。您也可以节省一个有价值的 IPv4 地址,并将它们全部放在同一个 IP 上。从非 SNI 浏览器访问仅支持 SNI 的站点的任何人都会收到相同的证书警告,无论其地址是否与非 SNI 站点相同。唯一需要考虑的是,当非 SNI 客户端访问仅支持 SNI 的站点时,您是否希望向非 SNI 客户端提供支持非 SNI 客户端的站点证书。

我现在已经输入了“SNI”很多次,它开始失去所有意义了......

相关内容