Answers:
我认为如何解释虚拟主机和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证书(可以,但是,这对其他所有人都非常不利),因此通常您需要为每个域使用单独的IP HTTPS域。
解决此问题的真正方法是“服务器名称指示”:
http://en.wikipedia.org/wiki/Server_Name_Indication
它只是刚刚开始部署到服务器和Web客户端中,因此您现在不能真正使用它了,但是希望在几年后这不会成为一个大问题。
问题是SSL证书绑定到IP地址而不是主机名。当连接进入HTTPS请求的IP地址时,第一个操作是通过传递服务器证书和/或客户端证书来建立SSL通信。在连接握手的此阶段,Apache服务器无法知道要通过的请求是针对什么的。对于HTTP(非SSL)流量而言,这是不同的,因为在建立连接后,如果客户端发送Host
标头或将其传递给配置的第一个虚拟主机,则Apache服务器可以确定要使用的虚拟主机配置。
如果您在同一域下有多个虚拟主机,则可以在IP地址上设置一个通配符证书,并且可以使用定义了不同服务器名称的多个虚拟主机;但是,如果这些服务器名称不在同一域名下,则会生成客户端服务器错误。这将起作用,因为通配符证书对于该域名下的所有主机名均有效。如果域名不同,您将需要另一个IP地址,因为为该IP地址定义的第一个证书将是为连接客户端而提供的证书。
可以将其作为SAN(主题备用名称)添加到一个SSL证书中。在我的工作中,我不得不要求组织sll证书。我用了globalsign。
实际上,使用现代软件,您可以使用称为“ SNI-服务器名称指示”的新功能,通过一个IP地址为多个HTTPS站点提供服务。
http://en.wikipedia.org/wiki/Server_Name_Indication
http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
我尚未亲自使用此功能,但这对内部和Intranet网站来说听起来不错。大多数现代浏览器都支持SNI。IE6不支持SNI,但IE7支持。
(更正:20100426-Windows XP完全不支持SNI。WindowsVista及更高版本确实支持SNI。请参见http://msdn.microsoft.com/zh-cn/library/dd208005%的 “ 2.2.3节”。28v = PROT.13%29.aspx#id8)。
我认为OP正在询问如果他向具有多个虚拟主机的IP添加SSL证书会发生什么情况。如果没有其他虚拟主机使用SSL证书,则他应该是无罪的。
如果您尝试在同一IP上添加两个证书,则到处都只会使用第一个读取的证书。一个IP-一个SSL证书。
如果要在同一IP上获取更多SSL证书,请考虑获取多域(即所谓的UCC-@ godaddy进行检查)或通配符(更昂贵)的证书。