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

Joh*_*unt 5 ssl sni apache-2.2

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

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

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

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

Bar*_*ard 6

正如其他人所说,只需将第一个站点作为第一个虚拟主机,无论是否启用 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>
Run Code Online (Sandbox Code Playgroud)

然而,站点 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>
Run Code Online (Sandbox Code Playgroud)

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

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

对于 www.site2.com,它变得更有趣:

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

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

此选项的主要缺点是,根据网站的关联程度,在同一证书上使用两个不同的 URL 可能看起来不专业。但是,大概如果他们共享一个主机,他们是有些相关的业务(除非服务器归托管公司所有),所以这可能不是问题。

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