我们有一个网站www.name1.domain.com,我们已成功创建并实施了SSL证书。然后我们添加了另一个网站www.name2.domain.com,并且在IE7和IE8中看到了一些奇怪的行为(惊喜!)。
基本上,当我们转到https://www.name2.domain.com/时,IE7,8会报告主机名不匹配。当我在IE中为此域添加和查看此证书时,主机名不正确,但属于较旧的主机名,即www.name1.domain.com。
Firefox没有此问题,并为第二个站点选择了正确的主机名www.name2.domain.com而没有问题。
任何想法为什么IE行为不端(除了时髦的( - :)?
答案 0 :(得分:7)
您的问题是Windows XP上的Internet Explorer(可能还有其他软件)不支持SNI。
我刚遇到同样的问题 - 基本上Firefox和Chrome都可以,并获得正确的证书,但Internet Explorer却没有。然后我查了一下,在维基百科上看到了this,其中包括:
支持TLS服务器名称指示的浏览器[7] Internet Explorer 7或更高版本,在Windows Vista或更高版本上。不起作用 Windows XP,甚至是Internet Explorer 8。
所以,你的apache / openSSL组合是SNI能够做到这一点,但Windows XP不是。
我的解决方案是我将主子域首先放在VirtualHost配置中,将辅助子域放在第二个子域中。至少对客户解释为何会出现这种情况的解释较少。 我不知道它是否适合你。
答案 1 :(得分:2)
Firefox支持在同一个端口上运行SSL,443(使用相同的IP)到两个虚拟主机(在Apache中),但IE7没有。
http://www.eggheadcafe.com/software/aspnet/36069240/sni-support.aspx
====
http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2
为什么不能使用基于名称的虚拟主机来识别不同的SSL虚拟主机? 基于名称的虚拟主机是一种非常流行的识别不同虚拟主机的方法。它允许您为许多不同的站点使用相同的IP地址和相同的端口号。当人们转向使用SSL时,似乎很自然地认为可以使用相同的方法在同一台服务器上拥有大量不同的SSL虚拟主机。
要知道这是不可能的,这是相当震惊的。
原因是SSL协议是一个封装HTTP协议的独立层。因此,SSL会话是一个单独的事务,它发生在HTTP会话开始之前。服务器在IP地址X和端口Y(通常为443)上接收SSL请求。由于SSL请求不包含任何Host:字段,因此服务器无法决定使用哪个SSL虚拟主机。通常,它只会使用它找到的第一个,它与指定的端口和IP地址相匹配。
当然,您可以使用基于名称的虚拟主机来识别许多非SSL虚拟主机(例如,全部在端口80上),然后使用单个SSL虚拟主机(在端口443上)。但是,如果这样做,您必须确保将非SSL端口号放在NameVirtualHost指令上,例如。
NameVirtualHost 192.168.1.1:80 其他解决方案包括:
为不同的SSL主机使用单独的IP地址。为不同的SSL主机使用不同的端口号。