使用 SSL 的 Apache 名称虚拟主机

Posted

技术标签:

【中文标题】使用 SSL 的 Apache 名称虚拟主机【英文标题】:Apache Name Virtual Host with SSL 【发布时间】:2010-10-05 18:20:21 【问题描述】:

我正在尝试设置我们的服务器以允许通过 SSL 进行流量。我知道 SSL 不适用于 Name Virtual Host,但我们所有的 apache 服务器都位于具有专用私有 IP 的虚拟机上。我们有一个主虚拟机,它设置了 mod_proxy 以将流量路由到适当的虚拟机。

但是,为了路由 https 流量,我们需要在代理和虚拟机上安装证书。我们有一个通配符证书,可以在我们所有的主机上使用。一切似乎都正常工作,但我在代理的 apache 日志中收到以下内容:

[警告] 初始化:SSL 服务器 IP/端口冲突:host1.domain.com:443 (/etc/apache2/sites-enabled/host1:1) 与 host2.domain.com:443 (/etc/apache2 /sites-enabled/host2:1)

对于我们在代理上设置的每个主机,都有一个错误消息。我们的代理虚拟主机设置如下:

<VirtualHost ipaddress:443>
    ServerName host1.domain.com
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / https://privateip:443/
    ProxyPassReverse / https://privateip:443/

    SSLProxyEngine on
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
</VirtualHost>

有什么办法可以让它工作吗?

【问题讨论】:

确保您生成的证书使用正确的Common Name,否则它将在某些浏览器中运行,而不是在 IE 中运行 【参考方案1】:

您必须添加以下部分才能使用给定 IP 启用 NameVirtualHost 功能。

NameVirtualHost IP_Address:443

【讨论】:

我确保在 httpd.conf 中将 #Include conf/extra/httpd-ssl.conf 注释掉,然后这在 httpd-vhosts.conf 中起作用:NameVirtualHost *:443 (linebreak) Listen 443 (linebreak)&lt;VirtualHost *:443&gt; (linebreak) SSLEngine On (linebreak) ...【参考方案2】:

虚拟主机看起来像这样:

NameVirtualHost IP_Address:443

<VirtualHost IP_Address:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/ca.crt    # Where "ca" is the name of the Certificate
    SSLCertificateKeyFile /etc/pki/tls/private/ca.key
    ServerAdmin webmaster@domain_name.com
    DocumentRoot /var/www/html
    ServerName www.domain_name.com
    ErrorLog logs/www.domain_name.com-error_log
    CustomLog logs/www.domain_name.com-access_log common
</VirtualHost>

【讨论】:

【参考方案3】:

首先,您需要在配置文件中包含 NameVirtualHost ip:443! 最后你可能有一个 80 的,但你也需要一个 443 的。

其次你需要一个 *.domain 证书(通配符)(可以制作一个)

第三,你只能在一个 ip 中创建 something.domain 网站(因为证书)

【讨论】:

你的一个端口号是错误的,我无法修复它 6 char min edit。【参考方案4】:

您可以替换:

VirtualHost ipaddress:443

VirtualHost *:443

您可能需要在所有 virt 主机上执行此操作。

它可能会清除该消息。让 ServerName 指令担心路由消息请求。

同样,如果您对同一台机器有多个 ip 的别名,您可能无法做到这一点。

【讨论】:

哈罗德,谢谢您的回复。我早些时候尝试过,但没有任何区别。【参考方案5】:

据我所知,Apache 从 2.2.12 版本开始支持 SNI 遗憾的是,文档还没有反映这种变化。

去http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI直到完成

【讨论】:

【参考方案6】:

Apache 不支持基于名称的虚拟主机上的 SSL,仅支持基于 IP 的虚拟主机。

来源:Apache 2.2 SSL FAQ 问题Why is it not possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?

与 SSL 不同,TLS 规范允许基于名称的主机(其他人提到的 SNI),但 Apache 尚不支持此功能。当针对 openssl 0.9.8 编译时,它应该会在未来的版本中。

另外,mod_gnutls 声称支持 SNI,但我从未真正尝试过。

【讨论】:

看来这个答案有点过时了 你是绝对正确的 基于名称的 SSL 不会工作。很好的链接。【参考方案7】:

听起来 Apache 正在警告您,您有多个具有相同 IP 地址和端口的 &lt;VirtualHost&gt; 部分......至于让它在没有警告的情况下工作,我认为您需要使用类似服务器名称指示的东西(SNI),一种识别作为 SSL 握手的一部分请求的主机名的方法。基本上,它允许您通过 SSL 进行基于名称的虚拟主机,但我不确定浏览器对它的支持程度。除了 SNI 之类的东西之外,您基本上只能为您公开到公共互联网的每个 IP 地址使用一个启用 SSL 的域名。

当然,如果您能够正常访问这些网站,您可能会忽略这些警告。这些特定的不是很严重 - 它们主要是指示如果您遇到问题应该查看什么

【讨论】:

大卫,感谢您的回复。在做了一些研究之后,我相信这将是要走的路。但是,在 Windows XP 下对 SNI 的支持有限。我想我无论如何都会尝试这个,因为我使用的是通配符证书。如果这不起作用,我想我现在必须忽略这些错误。 PS:大多数网站似乎将此称为服务器名称指示,而不是标识。 啊,我的错...我真的只记得首字母缩写词 SNI。我会编辑帖子。

以上是关于使用 SSL 的 Apache 名称虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

Apache:在服务器名称不匹配时禁用重定向到默认虚拟主机

如何使用别名在 Apache 虚拟主机上配置多个 SSL 证书?

如何在 Apache 上为虚拟主机设置不同的 SSL 证书?

如何在 Apache 上设置 2 个虚拟主机,其中一个主机使用 SSL 运行而其他不使用?

Apache 2、SSL 和客户端证书

更改虚拟主机后 Apache 无法启动