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

Posted

技术标签:

【中文标题】如何在 Apache 上为虚拟主机设置不同的 SSL 证书?【英文标题】:How can I setup different SSL-Certificates for vhosts on Apache? 【发布时间】:2010-09-21 12:38:11 【问题描述】:

我有一个网络服务器,它提供不同的域名,但只分配了一个 IP 地址。这适用于 Apache 中的虚拟主机。现在我想要网站的 SSL 加密连接。如何为不同的虚拟主机设置不同的 SSL 证书?

为不同的主机名使用不同的 IP 将是一种解决方案 - 不是很优雅但可能。但我想知道,如何为不同的虚拟主机使用不同的 SSL 证书。所以我寻找一种只有一个 IP 地址的解决方案。

【问题讨论】:

【参考方案1】:

更新:2013 年

随着旧版浏览器的淘汰,SNI 似乎终于开始占据上风。这是docs for Apache SNI,这是wikipedia article on SNI,其中包括支持它的浏览器上的图表。简而言之,所有主流浏览器都在支持的版本中支持它;如果支持旧版浏览器很重要,您可能必须考虑到这一点。

------上一个答案------------

SSL 主机必须绑定到唯一的 IP 地址/端口组合,因此您不能使用虚拟主机(或者至少,每个 IP 地址只能有一个 ssl 主机)。这是因为 https 在 Host: 参数在 http 中发送之前开始加密,因此它无法从主机名确定使用哪个密码 - 它只有 IP 地址。

如果 HTTP 有一个 TLS 命令,这将很容易解决,以便它可以在询问主机名后启动 SSL,但没有人问我。

如需确定答案,请参阅http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2

【讨论】:

实际上,现在有 RFC 2817,它确实允许在 HTTP 连接中进行 TLS 升级。它是在 Apache 中实现的。 但是浏览器还支持吗?【参考方案2】:

AFAIK 无法使用 mod_ssl 为基于名称的虚拟主机设置不同的 SSL 证书。您可以阅读详细原因here。另一种方法是使用基于 IP 的虚拟主机(这可能是不可能的/不是一个非常令人满意的解决方案) - 只需插入不同的 SSLCertificateFile 指令,或者您可以尝试使用 mod_gnutls 的this 方法。

【讨论】:

哇,SNI 的 RFC 始于 2003 年,但它仍然没有流行起来?我对浏览器已经支持它的说法很感兴趣。【参考方案3】:

在给出答案的提示并给出答案(尤其是 Martin v. Löwis)之后,我进行了一些谷歌搜索并找到了this website about RFC 2817 and RFC 3546。 RFC 3546 似乎是一个很好的解决方案。

【讨论】:

【参考方案4】:

每个虚拟主机都需要一个单独的 IP:port 组合。

RFC 3546 尚不可行。 IE只有在Vista下才支持,上次查了一下Safari也不管理。

【讨论】:

是的,支持此功能的浏览器受到限制,但这是一种可能的解决方案。遗憾的是,不存在“正确”的解决方案。 RFC 3546 似乎是一个好的解决方案的最大希望。暂时您必须订购更多 IP 或限制浏览器。 是的,或者在不同端口上运行的丑陋临时解决方案。 RFC3546 将会发生,但不幸的是,那一天还有很长的路要走。【参考方案5】:

虽然 DGM 提到的所有内容都是正确的,但已经有人尝试绕过对每个证书(包括 mod_gnutls)和使用 TLS extensions 的唯一 IP 地址的要求。有一些缺点,但您可能可以接受。

【讨论】:

【参考方案6】:

终于有可能了!您需要服务器和客户端都支持服务器名称指示 (SNI)

支持 SNI 的浏览器:

Mozilla Firefox 2.0 或更高版本 Opera 8.0 或更高版本(启用 TLS 1.1) Internet Explorer 7.0 或更高版本(在 Vista 上,不是 XP) 谷歌浏览器 Mac OS X 10.5.6 上的 Safari 3.2.1

此文档显示配置服务器的方法:SSL with Virtual Hosts Using SNI

【讨论】:

以上是关于如何在 Apache 上为虚拟主机设置不同的 SSL 证书?的主要内容,如果未能解决你的问题,请参考以下文章

使用 apache 端口 8080 在 xampp 上为 zendframework 设置虚拟主机

在 Windows 上设置 Apache 虚拟主机

如何在 Business-Objects BI 4.1 上为 Apache 设置反向代理?

如何在 Elastic Beanstalk 上为特定容器设置文件夹权限

如何在主机上为 docker-compose.yml 中的命名卷设置路径

在 Mac 上为虚拟机设置 localhost