我有一台设置了两个 SSL 证书的服务器,一个用于内部访问,访问方式类似,host.my-local.net
另一个用于外部访问,访问方式类似185.185.185.185
(这不是实际的 IP 地址,但它是一个 IP 地址,因为没有分配主机名)。当通过外部地址访问时,连接将通过负载平衡器/防火墙,而我无权访问它,我只知道它将特定端口上的传入连接转换为 SSL 端口上的内部地址。
问题是,当外部连接进入时,我会收到浏览器警告,提示该网站正在伪装成host.my-local.net
;它提供的证书host.my-local.net
不是185.185.185.185
。我在 apache2 配置文件中为这两个名称设置了一个虚拟主机,因此我认为由于某种原因,服务器无法区分外部连接和 LAN 连接。使用简单的 NAT 时,我还没有遇到过这个问题,所以我不知道如果负载平衡器使请求看起来像是来自 LAN 而不是内部,为什么会有所不同。
我已经验证了我使用的浏览器支持 SNI(Google Chrome),并且 Apache 2.4 显然开箱即用,无需 NameVirtualHost 指令。但是,文档说:
In 2.3.11 and later, any time an IP address and port combination is used in
multiple virtual hosts, name-based virtual hosting is automatically enabled
for that address.
但是,两个不同的虚拟主机使用的 IP 地址并不相同,一个是内部(LAN)IP 地址,一个是外部(世界可见)IP 地址,那么这在这里适用吗?
为了阐明我的配置,我设置了两个虚拟主机,如下所示:
<VirtualHost 185.185.185.185:443>
# here i specify the certificate for 185.185.185.185, e.g.
SSLCertificateFile /etc/ssl/private/185.185.185.185.crt
</VirtualHost>
<VirtualHost host.my-local.net:443>
# here i specify the certificate for host.my-local.net, e.g.
SSLCertificateFile /etc/ssl/private/host.my-local.net.crt
</VirtualHost>
答案1
感谢@ShaneMadden 的评论,我才能够解决这个问题。
这个问题是我需要两个 VirtualHost 使用通配符指定相同的 IP。所以我的配置需要如下所示:
<VirtualHost *:443>
# here i specify the certificate for 185.185.185.185, e.g.
SSLCertificateFile /etc/ssl/private/185.185.185.185.crt
ServerName 185.185.185.185
</VirtualHost>
<VirtualHost *:443>
# here i specify the certificate for host.my-local.net, e.g.
SSLCertificateFile /etc/ssl/private/host.my-local.net.crt
ServerName host.my-local.net
</VirtualHost>