我有一个具有一个 IP 地址的 apache 服务器。(在 debian 服务器上)。
我有几个用于 http 的虚拟主机和一个用于 https 的虚拟主机
一个虚拟主机,将流量重定向到 https 虚拟主机,这样就可以正常工作,如下所示
<VirtualHost *:80>
ServerName mymainsite.com
ServerAlias www.mymainsite.com
ServerAlias myothersite.org
ServerAlias www.myothersite.org
RewriteEngine on
RewriteRule ^(.*)$ https://www.mymainsite.com$1 [L,R=301]
(...)
我有另一个用于 https 的 vhost,就像这样
<VirtualHost *:443>
ServerName www.mymainsite.com
(...)
并且这工作正常,所有非 https 都被转发到 https,这非常棒...但是问题来了。
有时人们会访问这个网址https://www.myothersite.org
这是由 https vhost 回答的,并创建“错误证书”错误。
问题是:有没有办法可以防止这种情况,而无需使用第二个 IP 地址,或购买多 URL 或通配符 SSL 证书?
编辑:只需删除一些多余的文字
答案1
您需要使用名为服务器名称指示(SNI)。此扩展将允许服务器确定请求指定给哪个命名虚拟主机,并相应地对其进行修补。
您的 apache 可能内置了对 SNI 的支持,但要检查它,只需在您的 IP、端口 443 上设置两个名称虚拟主机,然后尝试启动 apache。如果您的 apache 不支持 SNI,error_log 将显示“您不应将基于名称的虚拟主机与 SSL 结合使用!!”如果内置了 SNI,则错误日志将显示“[warn] Init:基于名称的 SSL 虚拟主机仅适用于具有 TLS 服务器名称指示支持的客户端(RFC 4366)”。
还要注意的是,浏览器也需要支持 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
是的,简而言之,您可以在同一个 IP 上拥有 2 个或更多不同的域及其各自的 SSL 证书,只需像第一个域一样配置其他 SSL 域即可。如果您的 apache 缺乏对 SNI 的支持,您将需要找到另一个 apache 包或重建支持 SNI 的包以使其正常工作。