如何在 SSL 上设置 Apache NameVirtualHost?

Hou*_*man 5 ubuntu apache-2.2

我想将两个 DNS 的 A 记录设置为指向我的 Ubuntu 实例。然后 Apache 应该相应地读取域名并将传入的请求指向正确的物理路径。

我已经设置好了这是/etc/apache2/ports.conf的内容

我担心 WinXP 用户无法根据下面的评论访问我的 SSL 站点,那么我应该如何做?

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>
Run Code Online (Sandbox Code Playgroud)

大多数人都有 WinXP 和 Internet Explorer,所以这有点令人担忧。我如何以不同的方式设置 SSL,以便它对每个人都有效?

Bru*_*uno 10

在同一个 Apache Httpd 服务器(以及任何 HTTPS 服务器)上使用多个主机名会带来两个问题:

  • 为确保连接安全,客户端必须首先验证服务器证书。
  • 如果有多个证书可供服务器使用,则服务器必须能够从客户端请求中获取要选择的证书。

HTTPS 是基于 SSL/TLS 的 HTTP:建立安全隧道的 SSL/TLS 握手由客户端在创建 TCP 连接之后、在进行任何 HTTP 交换之前启动。HTTPS 交换的所有后续 HTTP 流量都通过此 SSL/TLS 连接完成。

服务器证书由服务器作为 SSL/TLS 握手的一部分发送。验证过程依赖于 (a) 验证证书是可信的,以及 (b) 验证它是为客户端打算联系的服务器颁发的。StackOverflow 上的这个答案中有更多详细信息。

在 HTTP 中,请求的主机名在 HTTPHost标头中发送。这就是基于名称的虚拟主机的工作方式:分派是基于HostApache Httpd 内部的标头完成的。

但是,在HostSSL/TLS 成功完成之前,Apache Httpd 无法使用HTTP标头。因此,在发送服务器证书之前它不可用。

有两种方法可以帮助 Apache Httpd 在握手期间选择使用哪个证书,而不依赖于任何 HTTP 流量:

  • 使用每个 IP 地址/端口组合的证书。这是传统的方式。
  • 使用SSL/TLS服务器名称指示扩展,在建立安全隧道的 SSL/TLS 握手期间发送。此选项的问题在于并非所有浏览器都支持它。特别是,XP 上的任何版本的 IE 都不支持它(我认为还有一些移动浏览器)。

如果您无法使用 SNI 或在您的服务器上有多个 IP 地址,您可以使用对您想要提供服务的所有主机名都有效的证书。这可以通过使用:

  • 颁发给通配符名称的证书(但不鼓励使用它们),或
  • 具有多个主题备用名称 DNS 条目的证书。这应该是您的首选。

如果您真的想尝试 SNI,它应该使用足够新的 Apache Httpd 2 版本,使用足够新的 OpenSSL 版本(如果使用mod_ssl与主代码库一起提供的)。这在此处记录:http : //wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI