Apache中同一IP多个HTTPS虚拟主机的实现

| 5 Comments

在 Apache 文档中提到,不能在单个 IP 上同时有多个按名字识别的虚拟主机("named virtual host")。不完全是这样。

HTTPS协议的过程是:服务器首先与客户机之间进行服务器身份验证并协商安全会话,然后,客户端向服务器发送 HTTP 请求。这样一来,在客户端开始发送请求之前,服务器就已经把证书发给了客户端(客户端根据本地的根证书去验证证书链,等等)。而最重要的是,为了表明身份,这个证书的周知名称("Common Name")填写的应该是域名,否则浏览器会给出警告。

既然在这个过程中,客户端就所访问的域名所处的地位是"被告知"的地位,因此,客户端再发出的 Host: 请求头也就显得不那么有意义了。另一方面,如果客户请求的域名与周知名称不符,浏览器也会给出警告。至少,在表面上看是这样。

不过,对于自行签署的证书,以及一些发证机构而言,其实还可以签署一种普适HTTPS证书,这种证书的周知名称一栏是 *.domain.tld 这样的形式,即其主机名部分可以是任意字符串,而只有域名部分是确定的。

当然,这种证书的安全性有一定的负面影响:由于一个证书可以验证整个域下面的所有服务器,一旦其被破解,则所有加密通讯也就同时失密了(当然,可以每台服务器使用自己的单独的证书),不过这个问题并不是太严重,通常还算是尚可接受的范围。另一个潜在的影响是,某些手机上运行的浏览器不能正确处理这种证书,不过这个问题仅限于希望给手机提供服务的网站。

因此,简而言之,符合这样几个条件的前提下,是可以在同一个IP上部署多个HTTPS虚拟主机的:a) 这些虚拟主机是同属于同一域名的子域名 b) 拥有普适证书 c) 正确地配置Apache。


Apache配置要点

  • 在HTTPS(TCP 443)端口上配置NameVirtualHost,例如 NameVirtualHost *:443
  • 为每个虚拟主机配置同样的 SSL 设置(事实上只有第一个会生效)
  • 为每个虚拟主机配置对应的ServerName

5 Comments

除了这种wildcard证书外,还可以使用SSL扩展: server name indication ( http://en.wikipedia.org/wiki/Server_Name_Indication ) ,但这个目前支持好像还有限,包括浏览器。

啊?我一直都是在一个IP上配多个虚拟主机。你知道的,那些1950就2网卡,没多的可用。
不过,要支持SSL那么必须有独立IP。这貌似是死的定律。

我总结的:

要解决这个问题,实现一个Apache服务器上提供多个SSL虚拟主机,可以:

* 使用多域名SSL证书,可以实现一个IP,一个443端口上多个SSL虚拟主机;
* 为所有SSL虚拟主机配置单独的端口。比如,默认的虚拟主机使用443,其他的使用8080或8081等,且每个SSL虚拟主机必须独占一个端口;
* 为Apache服务器配置多个IP,每个SSL虚拟主机独占IP。如果只有一张物理网卡,可以配置为网卡配置子接口;
* 使用mod_gnutls模块,创建多个SSL虚拟主机

Leave a comment

About this Entry

This page contains a single entry by Xin LI published on June 25, 2009 8:49 AM.

驱动程序是什么 was the previous entry in this blog.

DNS安全:投毒攻击与缓存服务器的配置 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.01