同一 IP 上有多个带 SSL 的域名

同一 IP 上有多个带 SSL 的域名

我知道设置 SSL 需要专用 IP。如果我们为共享 IP 的域添加 SSL,会发生什么情况?(Namevirtualhost)

答案1

我认为解释虚拟主机和 SSL/TLS 的真正问题是一个好主意。

当你通过 HTTP 连接到 Apache 服务器时,你会发送一组 http 标头。它们看起来像这样:

GET /index.html HTTP/1.1
 Host: www.nice-puppies.com

如果您有虚拟主机,apache 将查看 hosts 字段,然后为您获取正确的 index.html。问题在于您添加 SSL/TLS 时。服务器在您发送 http 请求之前设置加密。因此,服务器在身份验证/加密完成之前不知道您要访问 www.nice-puppies.com 还是 www.evil-haxxor.com。服务器无法猜测(因为发送错误的证书会给您一个令人讨厌的错误消息)。

一种解决方案是使用通配符证书(如上所述),该证书对 *.nice-puppies.com 有效。这样,您可以将同一个证书用于多个域,但您不能拥有 *.com 证书(好吧,您可以,但这对其他人来说非常糟糕),因此通常您需要为每个 HTTPS 域使用单独的 IP。

答案2

真正解决这个问题的方法是“服务器名称指示”:

http://en.wikipedia.org/wiki/服务器名称指示

它还才刚刚开始推广到服务器和 Web 客户端,所以现在你还不能真正使用它,但希望几年后这不会成为一个大问题。

答案3

问题在于 SSL 证书绑定到 IP 地址而不是主机名。当 HTTPS 请求的连接通过 IP 地址进入时,第一个操作是通过传递服务器证书和/或客户端证书来建立 SSL 通信。在连接握手的这个阶段,Apache 服务器无法知道即将通过的请求是什么。这对于 HTTP(非 SSL)流量来说有所不同,因为在建立连接后,如果客户端发送标头,Apache 服务器可以确定要使用的虚拟主机配置,Host否则它会将其交给配置的第一个虚拟主机。

如果您在同一个域下有多个虚拟主机,您可以在 IP 地址上设置单个通配符证书,并定义具有不同服务器名称的多个虚拟主机;但是,如果这些服务器名称不在同一域名下,它们将生成客户端服务器错误。这将有效,因为通配符证书对该域名下的所有主机名都有效。如果域名不同,您将需要另一个 IP 地址,因为为该 IP 地址定义的第一个证书将是用于连接客户端的证书。

答案4

实际上,借助现代软件,您可以使用名为“SNI - 服务器名称指示”的新功能,通过单个 IP 地址为多个 HTTPS 站点提供服务。

http://en.wikipedia.org/wiki/服务器名称指示

http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

我自己还没有用过这个,但它听起来对内部和内联网站点都不错。大多数现代浏览器都支持 SNI。IE6 不支持 SNI,但 IE7 支持。

(更正:20100426 - Windows XP 根本不支持 SNI。Windows Vista 及更高版本支持 SNI。请参阅“第 2.2.3 节”http://msdn.microsoft.com/en-us/library/dd208005%28v=PROT.13%29.aspx#id8)。

相关内容