我有一个对多个(子)域有效的 SSL 证书。在 Apache 中,我已将其配置如下:
在/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!!
所以,我的问题是:我应该如何配置它?从警告消息中可以清楚地看出我做错了什么(尽管它确实有效!),但是,上述配置是唯一可以正常工作的配置。这有点烦人,因为配置文件明确依赖于我的 IP 地址。
答案1
配置正确。
Apache 发出警告是因为它认为您错误地拥有多个具有相同证书的 SSL VirtualHosts(因为大多数情况下,此类配置在客户端上表现为证书错误)。您可以忽略警告消息,主要是因为,正如您所说的,它按您想要的方式工作。
如果你希望配置独立于 IP 地址,你可以指定
<VirtualHost *:80>
在您的配置文件中。当然,您必须有相应的 NameVirtualHost 条目:
NameVirtualHost *:80
答案2
您可以将相同的证书放入每个 VirtualHost 指令中,并定义您的服务器配置 - 基本上结合您上面所写的内容。
当您希望 apache 查看传入的标头并根据客户端发送到实际虚拟服务器的主机字符串进行路由时,NameVirtualHost 指令用于非 SSL 流量。
答案3
每个套接字只能有一个 https 站点,因此您必须更改 VHost 端口并将其与新证书关联。如果所有这些站点都需要在 443 端口上运行,则需要更多 IP。
答案4
您可以使用 nginx 来代替或者位于 apache 前面。
大多数 Web 服务器(apache、iis 等)无法正确使用命名 SSL 主机,因为它们在确定使用哪个 SSL 证书、进行协商等之前确定虚拟网站。SNI 是一种黑客技术,无法在许多浏览器上发挥作用。
但是,nginx 可以优雅地处理基于名称的 SSL 主机,因为它允许您将证书与 IP/端口关联,然后检查主机标头以确定将请求路由到何处。目的地可以由 nginx 提供服务,也可以反向代理到 apache、iis、其他机器等等。它是传入 tcp/ip 请求的瑞士军刀。它具有许多与通常通过硬件负载平衡器完成的 SSL 卸载和重定向相同的功能,包括简单的负载平衡。