在同一IP上使用SSL的多个域

我知道build立SSL需要一个专用的IP。 如果我们为共享IP的域添加SSL,会发生什么? (了NameVirtualHost)

我认为如何解释虚拟主机和SSL / TLS的真正问题是个好主意。

当你通过HTTP连接到apache服务器时,你会发送一组http头。 他们看起来像这样:

GET /index.html HTTP/1.1 Host: www.nice-puppies.com 

如果你有虚拟主机的Apache将查看主机字段,然后为您提取正确的index.html。 问题是当你添加SSL / TLS。 服务器在您发送您的http请求之前设置encryption。 因此,服务器不知道你是否要去www.nice-puppies.com或www.evil-haxxor.com,直到authentication/encryption完成。 服务器不能猜测(因为发送错误的证书给你一个讨厌的错误信息)。

一种解决scheme是通配符证书(如上所述),对* .nice-puppies.com有效。 这样,你可以使用多个域的相同的证书,但你不能有一个* .com证书(好吧,你可以,但这将是非常糟糕的其他人),所以一般来说,你将需要每个单独的IP HTTPS域。

这个问题的真正的解决办法是“服务器名称指示”:

http://en.wikipedia.org/wiki/Server_Name_Indication

它只是开始被推广到服务器和networking客户端,所以这不是现在可以使用的东西,但希望在未来几年内,这不会是一个大问题。

问题是SSL证书绑定到IP地址而不是主机名。 当连接进入HTTPS请求的IP地址时,首先要通过传递服务器证书和/或客户端证书来build立SSL通信。 在这个连接握手阶段,Apache服务器无法知道要通过的请求是什么。 对于HTTP(非SSL)stream量,这是不同的,因为在build立连接之后,如果客户端发送Host头,Apache服务器可以确定要使用的虚拟主机configuration,否则它会将其交给configuration的第一个虚拟主机。

如果您在同一个域下有多个虚拟主机,您可以在IP地址上设置单个通配符证书,并定义多个具有不同服务器名称的虚拟主机; 但是,如果这些服务器名称不在相同的域名下,则会生成客户端服务器错误。 这将作为通配符证书对该域名下的所有主机名有效。 如果域名不同,则需要另一个IP地址,因为为该IP地址定义的第一个证书将是为连接客户端提供的第一个证书。

这可以作为SAN(主题备用名称)添加到单个SSL证书中。 在我感到不解之际,我不得不申请一个组织的证书。 我用globalsign。

实际上,使用现代软件,您可以使用名为“SNI – 服务器名称指示”的新function,通过单个IP地址为多个HTTPS站点提供服务。

http://en.wikipedia.org/wiki/Server_Name_Indication

http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

我还没有使用这个,但这对内部和内部网站来说听起来不错。 大多数现代浏览器都支持SNI。 IE6不支持SNI,但IE7不支持。

(更正:20100426 – Windows XP完全不支持SNI,Windows Vista及以上版本支持SNI,详见http://msdn.microsoft.com/en-us/library/dd208005% 28v = PROT.13%29.aspx#id8 )。

我正在处理同样的问题。 作为我的testing,IE7及更高版本(仅在Win7和Vista中)/ Chrome / Firefox / Safari / Opera支持“服务器名称指示”。 事实上,如果浏览器使用Tsl 1.0,它支持“服务器名称指示”。

我认为OP是问如果他向有许多虚拟主机的IP添加SSL证书会发生什么。 如果没有其他的虚拟主机使用SSL证书,那么他应该是明确的。

UC证书肯定是要走的路: http : //www.sslshopper.com/unified-communications-uc-ssl-certificates.html

如果您尝试在同一个IP上添加两个证书,则只有首先读取的证书将被使用。 一个IP一个SSL证书。

如果你想在同一个IP上获得更多的SSL证书,可以考虑获得多域(所谓的UCC – 检查出@ godaddy )或通配符(更昂贵的)证书。