我刚刚设置了启用了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/
请求的简要摘要:
实际的数据被encryption发送:
GET / HTTP/1.1 Host: www.example.com
问题是,域名www.example.com
将在证书被确定后被知道。
一个解决scheme就是在SSL握手之前发送Host
头字段的SNI 。 这是一个相对较新的技术,可能不被所有的浏览器支持。
通常情况下,SSL是在任何通信之前build立的。
HTTP协议通过Host:
头部告诉通信中的服务器名称。
所以,SSLbuild立之前已知什么主机名请求。
为了确保几乎所有浏览器都能接受SSL证书,您应该执行以下操作之一:
创build通配符SSL。 然后,所有对* .somedomain.com的请求将被浏览器接受。
在“主题备用名称”中创build所有需要的域名作为备选项的SSL证书。 不是为所有浏览器工作,而是为大多数主要工作。
使用SNI: http : //wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI ,在主stream浏览器中再次运行… Fe我们最好的朋友IE6不支持SNI。