我在 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 请求是这样开始的:
- 浏览器将名称(www.example.com)解析为 IP(10.0.0.1)
- 浏览器与 10.0.0.1、端口 80 建立 TCP 连接
- 浏览器发送 HTTP 请求,其中包括“Host:”标头,在本例中为“www.example.com”。
- Apache 使用主机头并将其与基于名称的虚拟主机进行匹配,并提供那里的任何服务。
另一方面,HTTPS(即基于 SSL 的 HTTP)请求的开始方式如下:
- 浏览器将名称(www.example.com)解析为 IP(10.0.0.1)
- 浏览器与 10.0.0.1、端口 443 建立 TCP 连接
- 浏览器与服务器协商 SSL 加密。证书中指定了站点名称 (www.example.com),因此在此阶段它必须与 SSL 匹配,否则浏览器会发出警告,指出 SSL 连接存在问题。
- 浏览器发送HTTP请求等。
您不能拥有与 10.0.0.1:443 相关联的不同证书的原因是,Apache 无法知道对于任何给定的传入连接应该使用哪个证书。