我的服务器上的 VirtualHost 配置有问题。我的服务器运行的是 Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-31-generic x86_64),带有 Apache/2.4.7 (Ubuntu)。
我已经从这里的其他帖子中阅读了大量有关 Apache 和 SNI 的文章,但我无法解决我的具体问题。
我从不同的域配置了几个 VirtualHosts,每个都有自己的 SSL 证书,如下所示:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName mydomain.com
ServerAlias www.mydomain.com
DocumentRoot /home/user/mydomain.com/public_html
ErrorLog /home/user/mydomain.com/logs/error.log
CustomLog /home/user/mydomain.com/logs/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName mydomain.com
ServerAlias www.mydomain.com
DocumentRoot /home/user/mydomain.com/public_html
ErrorLog /home/user/mydomain.com/logs/error.log
CustomLog /home/user/mydomain.com/logs/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mydomain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/mydomain.com.key
SSLCACertificateFile /etc/apache2/ssl/mydomain.com.root.crt
SSLCertificateChainFile /etc/apache2/ssl/mydomain.com.chain.crt
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName otherdomain.com
ServerAlias www.otherdomain.com
DocumentRoot /home/user/otherdomain.com/public_html
ErrorLog /home/user/otherdomain.com/logs/error.log
CustomLog /home/user/otherdomain.com/logs/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName otherdomain.com
ServerAlias www.otherdomain.com
DocumentRoot /home/user/otherdomain.com/public_html
ErrorLog /home/user/otherdomain.com/logs/error.log
CustomLog /home/user/otherdomain.com/logs/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/otherdomain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/otherdomain.com.key
SSLCACertificateFile /etc/apache2/ssl/otherdomain.com.root.crt
SSLCertificateChainFile /etc/apache2/ssl/otherdomain.com.chain.crt
</VirtualHost>
对于大多数浏览器来说,这在大多数情况下都可以正常工作,但是有时在特定设备上或随机时间,当我尝试转到“otherdomain.com”时,它会尝试获取“mydomain.com”的 SSL 证书,从而出现网络钓鱼/错误证书错误。
我读到 SNI 可能是解决方案,因此我在 Apache 配置中添加了以下内容:
<IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>
然而,在我的 Apache 版本(2.4)中,该功能似乎已被淘汰,每当我重新启动 Apache 时都会得到确认:
# service apache2 restart
* Restarting web server apache2
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:17
似乎也没有解决问题,我仍然收到该错误。每次使用旧黑莓手机时我都能重现此问题。
除了必须使用 SSL 为每个 VirtualHost 获取唯一的 IP 地址之外,我还有哪些选项可以解决此问题?
另外,我的示例仅显示了 2 个域,但实际上我有 5 个域设置了自己的 SSL 证书。当我能够复制该问题时,它们都获取了第一个域的 SSL 证书。
非常感谢任何帮助。
答案1
基于名称的虚拟主机不会被淘汰。该NameVirtualHost
设置被删除是因为它是多余的。其余配置将包含足够的信息,以便 Apache 知道是否必须启用该设置。
此外,SNI 并不是可以在服务器端打开或关闭的设置。要么客户端支持它并在发送给服务器的第一条消息中发送 SNI 字段,要么客户端不支持它,服务器对此无能为力。
您的选择是:
- 为每个域获取单独的 IP 地址。
- 更新尚不支持 SNI 的客户端以使用最新的软件。
- 获得涵盖所有领域的单一证书。
- 接受只有第一个域适用于所有客户端,其余域对于运行过时软件的少数客户端将会失效。