如何在 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 设置虚拟主机
如何在 Business-Objects BI 4.1 上为 Apache 设置反向代理?
如何在 Elastic Beanstalk 上为特定容器设置文件夹权限