![一台服务器上有多个 SSL 证书](https://linux22.com/image/1383164/%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%9C%89%E5%A4%9A%E4%B8%AA%20SSL%20%E8%AF%81%E4%B9%A6.png)
我们在相当小但专用的生产服务器上托管两个网站。两个网站都需要 SSL 身份验证。
因此,我们为它们两个都设置了虚拟主机。它们都引用了自己的 domain.key、domain.crt 和 domain.intermediate.crt 文件。
每个站点的每个 CSR 和证书文件都是使用其自己独特的信息设置的,并且它们之间没有任何共享内容(服务器本身除外)
但是,无论首先引用哪个站点的符号链接(在 /etc/apache2/sites-enabled 中设置),都是引用其证书的站点,即使我们访问的是第二个站点。
例如,假设我们的公司是 Cadbury 和 Nestle。我们为这两个网站设置了各自的证书,但我们首先在 apache 的 site-enabled 文件夹中创建 Cadbury 的符号链接,然后再创建 Nestle 的符号链接。
您可以顺利访问雀巢,但如果您检查证书安装,它会引用吉百利的证书。
我们在专用的 Ubuntu 12.04.3 LTS 服务器上托管这些网站。两个证书均由 Thawte.com 提供。
我遇到了一些可能的解决方案,但都没有成功。我希望其他人有一个不错的解决方案?
谢谢
编辑: 似乎对某些人来说唯一可行的其他解决方案是将 SNI 与 Apache 结合使用。但是,这里的设置似乎与我们的设置完全不一致。
答案1
在单个 IP 地址上托管多个 SSL 站点的问题在于,SSL 证书交换首先发生,然后才是让 Web 服务器知道您要定位哪个站点的 GET 语句。
即使你输入服务器的名称https://google.com进入浏览器后,名称将解析为其 IP 地址,并向该 IP 地址发起 SSL 会话。我们定位的特定 URL 不能是标准 SSL 握手的一部分,否则会被窃听者看到。因此,Web 服务器无法知道要使用哪个证书,因此通常使用第一个证书。
信噪比是 TLS/SSL 的扩展,允许将主机名包含在会话协商中。目前,客户端和服务器广泛支持此功能。虽然这确实会使主机名对窃听者可见,但它被认为是可以接受的,因为它仅包含主机名而不是完整的 URL(可能包含敏感信息),并且您很可能在启动 SSL 会话之前立即对主机名进行了未加密的 DNS 查找。
在 Apache 中,有三个步骤:
- 不要在 443 上使用默认网站
- 在 :443 虚拟主机定义中使用 ServerName 指令
- 确保 Apache使用最新的 OpenSSL 构建
如果 Apache 没有支持 SNI,您将在 Apache 错误日志中收到一条消息:
You should not use name-based virtual hosts in conjunction with SSL!!
如果一切顺利,您将在日志中看到以下内容:
[warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)