首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SSL上设置Apache NameVirtualHost?

如何在SSL上设置Apache NameVirtualHost?
EN

Server Fault用户
提问于 2012-01-15 20:37:32
回答 3查看 17.9K关注 0票数 5

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

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

我担心,根据下面的评论,WinXP用户无法访问我的SSL站点,那么我应该如何以不同的方式进行访问呢?

代码语言:javascript
复制
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>

大多数人都有WinXP和Internet,所以这有点让人担心。我如何以不同的方式设置SSL,使其对每个人都有效?

EN

回答 3

Server Fault用户

回答已采纳

发布于 2012-01-15 21:57:05

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

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

HTTPS是HTTP之上的SSL/TLS: SSL/TLS握手,它建立了安全隧道,是由客户端在创建TCP连接之后,在进行任何HTTP交换之前启动的。HTTPS交换的所有后续HTTP通信都是在这个SSL/TLS连接上完成的。

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

在HTTP中,请求的主机名在HTTP Host头中发送。基于名称的虚拟主机就是这样工作的:分派是基于Apache内部的Host头完成的。

但是,在成功完成Host /TLS之前,Apache无法使用header。因此,在发送服务器证书之前它是不可用的。

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

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

如果无法使用SNI或服务器上有多个IP地址,则可以使用对要服务的所有主机名有效的证书。这可以通过以下方法实现:

如果您真的想尝试SNI,那么它应该使用最近--足够的Apache 2版本,使用最近--足够的OpenSSL版本(如果使用的是主代码库提供的mod_ssl )。这里记录了这一点:http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

票数 10
EN

Server Fault用户

发布于 2012-01-15 21:16:37

SSL警告是关于基于名称的SSL站点的。传统的SSL在发送HTTP通信之前对连接进行加密,如果我没有弄错的话,它会加密TCP连接而不是HTTP会话。由于在HTTP协议中选择了虚拟主机,而且服务器需要在使用http之前设置一个安全连接,因此您只能在每个IP/端口组合中选择一个证书。默认情况下,defualt站点。

这一点改变了,因为您现在可以使用TLS (gnutls)进行加密,这实际上是SSL的“新版本”,允许基于名称的加密。但是,在旧操作系统和浏览器(如Windows )中不支持这一点。

如果你在XP上使用firefox或chrome而不是IE,这是可能的,它的工作很好。

如果您希望它在任何时候都能工作,请为网站的SSL版本配置多个IP和/或端口。如果您只有一个需要SSL的网站,则不再需要进一步的配置。

编辑:问题也变了

票数 2
EN

Server Fault用户

发布于 2016-03-02 21:15:12

虽然上面@Bruno所提供的答案确实说明了方法和原因,但它留下了一个问题,即如何用一个不太可行的解决方案来设置基于SSL/TLS启用的基于名称的虚拟主机--而是将其计算机的附加IP地址(或从他们的主机提供商那里购买)推迟,并根据情况更改httpd.conf的侦听参数。

IOW,@Bruno的答案中没有解决方案--您必须使用基于IP的虚拟主机。

另一方面,@ocsarjd解决了如何提供对基于名称的虚拟SSL主机的支持,此外还为坚持在XP上运行IE的人提供了一项工作。

使用:

代码语言:javascript
复制
<VirtualHost _default_:443>

然后,mod_rewrite为无法利用SNI的浏览器提供支持,因此,没有人需要购买和/或将附加的IP地址绑定到服务器,以便Apache侦听基于IP的虚拟主机方法中的连接。

具有讽刺意味的是,@Bruno的答案确实涵盖了这些协商是如何和为什么发生的,以及过时的浏览器如何无法在Apache服务器上适当地结合基于名称的SSL虚拟主机的原因。

由于OP提出这个问题已经有一段时间了,我建议不要使用这些过时的浏览器,因为这是客户端的人为操作不安全的软件所做的选择,在我看来,这只是一个应该被忽略的人。

尽管如此,一个默认的SSL虚拟主机,其信息类似于一个自定义404页面,告诉访问者他们正在运行一个不安全的浏览器客户端,这实际上还需要几年的时间,因为肯定会有一些人拒绝停止使用自XP被EOL开发以来没有收到修补程序的IE版本,而且所有(所谓的)“现代”浏览器(IE/Edge、Firefox、Chrome/Chromium、Opera、Safari)都将通过SNI在HTTPS上容纳基于名称的虚拟主机的功能。

票数 -1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/350127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档