【问题标题】:Apache Name Virtual Host with SSL使用 SSL 的 Apache 名称虚拟主机
【发布时间】: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 中运行

标签: apache ssl ssl-certificate


【解决方案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。我会编辑帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2012-01-22
      • 2016-11-05
      • 2011-11-04
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多