我在使用 Apache 和多个 SSL 证书时遇到了问题。如果我只为一个域配置它,一切都会正常工作,但是当我将另一个域添加为虚拟主机时,它会返回错误:
VirtualHost domain1.cz:443 overlaps with VirtualHost domain2.sk:443, the first has precedence, perhaps you need a NameVirtualHost directive
[Wed Nov 07 16:14:49 2012] [warn] NameVirtualHost *:443 has no VirtualHosts
我尝试了许多虚拟主机配置方法的组合,但结果仍然非常相似 - 第一个域名得到正确保护,第二个域名(domain2.sk)从第一个域名接收证书。
请问,您能帮我完成这种证书配置吗?
NameVirtualHost *:443
<VirtualHost domain1.cz:443>
ServerName domain1.cz
DocumentRoot /var/www/www.domain1.cz/htdocs/
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/apache2/ssl/domain1.cz/ssl.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain1.cz/ssl.key
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ssl/ca.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /var/www/www.domain1.cz/logs/ssl-access.log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
LogLevel warn
ErrorLog /var/www/www.domain1.cz/logs/ssl-error.log
</VirtualHost>
<VirtualHost domain2.sk:443>
ServerName domain2.sk
DocumentRoot /var/www/www.domain2.sk/htdocs/
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/apache2/ssl/domain2.sk/ssl.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain2.sk/ssl.key
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ssl/ca.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /var/www/www.domain2.sk/logs/ssl-access.log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
LogLevel warn
ErrorLog /var/www/www.domain2.sk/logs/ssl-error.log
</VirtualHost>
答案1
每个 IP 地址/端口只能提供一个 SSL 证书。为了使多个 SSL 正常工作,您要么需要另一个 IP 地址(推荐),要么将第二个 SSL 证书绑定到您 IP 上的另一个端口(可行,但对您的网站访问者来说很麻烦,因为端口必须包含在 URL 中)。请咨询您的主机,他们中的大多数都以实惠的价格提供额外的 IP。
此主题有更多信息。
编辑:我不会语法。
答案2
您发布的配置应该是正确的,但是<VirtualHost *:443>
在两种情况下都必须使用 和 ,而不是<VirtualHost domain1.cz:443>
或<VirtualHost domain2.sk:443>
。
您的指定domain1.cz
和domain2.sk
指令都是正确的ServerName
。
请注意,这将使用名为“服务器名称指示”的功能。您必须运行足够新的 Apache 和 OpenSSL 库,并且它不适用于较旧的浏览器。阅读更多这里关于 SNI。