Apache 2 - 具有多个虚拟主机的多个 SSL 站点

Apache 2 - 具有多个虚拟主机的多个 SSL 站点

我在 Apache 2 中拥有大约 10 个站点。这些都是独立站点 - 不是子域。我拥有其中两个站点的 SSL 证书,并且我想为它们两个站点设置 SSL,而不是强制我的非 SSL 站点使用任一证书。

我遇到的问题是我无法同时激活这两个证书,无论我访问哪个站点,它似乎总是默认使用第一个证书。

我一直在阅读这方面的信息,看起来我的服务器可能支持 SSI,但 Windows XP 不支持,所以这不是一个可行的选择。另外,我简要研究了 mod_gnutils,但我不能保证它能满足我的要求,而且如果不是绝对必要的话,我也不太愿意进行所有必要的安装/配置来使其工作。

任何有关此事的指导都将不胜感激!

这是两个 443 虚拟主机。我尝试引用如下所示的虚拟主机,以及其他变体,例如简单的 '' 和 ''。我也尝试过 NameVirtualHost 引用,但仍然无济于事。

Listen 443
NameVirtualHost www.site1.com:443
NameVirtualHost www.site2.com:443

<VirtualHost www.site1.com:443>
 DocumentRoot /var/www/site1/
 ServerName  www.site1.com:443

 #SSL 
 SSLEngine on
 SSLCertificateFile /path/to/ssl/site1.com.crt
 SSLCertificateKeyFile /path/to/ssl/site1.key
 SSLCertificateChainFile /path/to/ssl/bundle1.crt 

</VirtualHost>

<VirtualHost www.site2.com:443>
 DocumentRoot /var/www/site2/
 ServerName  www.site2.com:443

 #SSL 
 SSLEngine on
 SSLCertificateFile /path/to/ssl/site2.com.crt
 SSLCertificateKeyFile /path/to/ssl/sit2.key
 SSLCertificateChainFile /path/to/ssl/bundle2.crt  

</VirtualHost>

答案1

简短的回答是,您要么需要获取额外的 IP 地址,要么获取证书中包含多个名称的证书(SAN 或通配符)。

如果你想要在互联网上提供服务,SNI 确实不可行。目前支持它的浏览器确实不够多。

答案2

如果不使用 SNI,您就无法将多个 SSL 证书与单个 IP 地址/端口组合关联。

你唯一的解决方案是使用

  • 多个 IP 地址,每个都监听 443 端口。多个 IP 可能意味着成本增加,具体取决于您与谁托管,或者
  • 1 个 IP 地址,每个 IP 地址都有不同的端口。这样做的缺点是您的客户端需要在 URL 中指定端口,这有点麻烦。

一个正常的 HTTP 请求是这样开始的:

  1. 浏览器将名称(www.example.com)解析为 IP(10.0.0.1)
  2. 浏览器与 10.0.0.1、端口 80 建立 TCP 连接
  3. 浏览器发送 HTTP 请求,其中包括“Host:”标头,在本例中为“www.example.com”。
  4. Apache 使用主机头并将其与基于名称的虚拟主机进行匹配,并提供那里的任何服务。

另一方面,HTTPS(即基于 SSL 的 HTTP)请求的开始方式如下:

  1. 浏览器将名称(www.example.com)解析为 IP(10.0.0.1)
  2. 浏览器与 10.0.0.1、端口 443 建立 TCP 连接
  3. 浏览器与服务器协商 SSL 加密。证书中指定了站点名称 (www.example.com),因此在此阶段它必须与 SSL 匹配,否则浏览器会发出警告,指出 SSL 连接存在问题。
  4. 浏览器发送HTTP请求等。

您不能拥有与 10.0.0.1:443 相关联的不同证书的原因是,Apache 无法知道对于任何给定的传入连接应该使用哪个证书。

相关内容