为什么configuration了mod_ssl的apache为一个VirtualHost响应对任何域的请求?

我刚刚设置了启用了mod_ssl的Apache 2.2.18,并将其configuration为侦听端口443上的一个IP地址。有许多域都有DNSlogging指向此IP地址。 但是我想用“VirtualHost”来为Apacheconfiguration具有DocumentRoot的特定域。

我在httpd.conf中的configuration是这样的:

Listen 1.2.3.4:443 NameVirtualHost 1.2.3.4:443 <VirtualHost 1.2.3.4:443> DocumentRoot /data/www/domain.com ServerName www.domain.com SSLEngine On </VirtualHost> 

然而,我的问题是,这个Apache是​​使用这个虚拟主机的任何域指向相同的IP地址。 它看起来像忽略了“ServerName”参数。 我只想在特定的域上运行这个SSL-Apache。 任何人都可以帮忙?

这是因为SSL的工作原理。 为了理解这一点,你首先需要知道当你从一个网站请求一个页面时究竟发生了什么。

https://example.com/请求的简要摘要:

  1. 您使用端口443连接IP 1.2.3.4
  2. SSL握手和密钥交换。 在这里,证书进场了
  3. 实际的数据被encryption发送:

     GET / HTTP/1.1 Host: www.example.com 

    问题是,域名www.example.com将在证书被确定后被知道。

一个解决scheme就是在SSL握手之前发送Host头字段的SNI 。 这是一个相对较新的技术,可能不被所有的浏览器支持。

通常情况下,SSL是在任何通信之前build立的。

HTTP协议通过Host:头部告诉通信中的服务器名称。

所以,SSLbuild立之前已知什么主机名请求。

为了确保几乎所有浏览器都能接受SSL证书,您应该执行以下操作之一:

  1. 创build通配符SSL。 然后,所有对* .somedomain.com的请求将被浏览器接受。

  2. 在“主题备用名称”中创build所有需要的域名作为备选项的SSL证书。 不是为所有浏览器工作,而是为大多数主要工作。

  3. 使用SNI: http : //wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI ,在主stream浏览器中再次运行… Fe我们最好的朋友IE6不支持SNI。