Apache命名的虚拟主机和HTTPS

我有一个适用于多个(子)域的SSL证书。 在Apache中,我configuration如下:

/etc/apache2/apache2.conf

 NameVirtualHost <my ip>:443 

然后,我有一个名为虚拟主机

 <VirtualHost <my ip>:443> ServerName ... SSLEngine on SSLCertificateFile ... SSLCertificateKeyFile ... SSLCertificateChainFile ... SSLCACertificateFile ... </VirtualHost> 

最后,对于我希望通过HTTPS访问的其他站点,我只需要一个

 <VirtualHost <my ip>:443> ServerName ... </VirtualHost> 

好消息是它是有效的。 但是,当我启动Apache时,我收到警告消息

 [warn] Init: SSL server IP/port conflict: Domain A:443 (...) vs. Domain B:443 (...) [warn] Init: SSL server IP/port conflict: Domain C:443 (...) vs. Domain B:443 (...) [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!! 

所以,我的问题是:我应该如何configuration? 显然,从警告消息中我做了一些错误的事情(尽pipe它确实起作用了!),但是,上面的configuration是我唯一可以工作的configuration。 这有点烦人,因为configuration文件显式依赖于我的IP地址。

configuration是正确的。

Apache咆哮,因为它认为你有更多的SSL VirtualHosts具有相同的证书是错误的(因为大多数时候,像这样的configuration显示为客户端上的证书错误)。 您可以忽略警告信息,主要是因为像您所说的那样,它以您想要的方式工作。

如果你想configuration独立于IP地址,你可以指定

 <VirtualHost *:80> 

在你的configuration文件中。 当然,你必须有相应的NameVirtualHost条目:

 NameVirtualHost *:80 

您可以在每个VirtualHost指令中使用相同的证书,并定义您的服务器configuration – 基本上结合上面所写的内容。

当您希望apache根据客户端发送到实际虚拟服务器的主机string查看传入报头和路由时,NameVirtualHost指令用于NON ssl通信。

每个套接字只能有一个https站点,因此您必须更改VHost端口并将其与新证书相关联。 如果所有这些站点都需要在443端口上运行,则需要更多的IP。

你可以使用nginx而不是或在apache之前。

大多数Web服务器(Apache,iis等)不能正确地使用命名的SSL主机,因为它们在确定使用哪个SSL证书之前确定了虚拟网站,正在进行协商等等。SNI事情有点像黑客,与许多浏览器一起工作。

然而,nginx会优雅地使用基于名称的SSL主机,因为它允许您将证书与IP /端口相关联,然后检查主机头以确定路由请求的位置。 目的地可以通过nginx或反向代理到Apache,iis,其他机器,无论..这是传入的TCP / IP请求的瑞士军刀。 它具有很多与硬件负载均衡器(包括简单负载均衡)相同的卸载和redirectfunction。