设想:
我有 2 个域名:thinkingmonkey.me
& thinkingmonkey.com
。整个网站都可通过 访问https
。从通用名称为 的 CA 购买了证书thinkingmonkey.me
。
为了http
:
www.thinkingmonkey.com, thinkingmonkey.com& www.thinkingmonkey.me拥有单个虚拟主机并重定向至https://thinkingmonkey.me使用 _mod_rewrite_ 规则。
thinkingmonkey.me有其单独的虚拟主机。
一切正常。
情况也一样https
:
IEwww.thinkingmonkey.com, thinkingmonkey.com& www.thinkingmonkey.com拥有单个虚拟主机并重定向至https://thinkingmonkey.me使用 _mod_rewrite_ 规则。
thinkingmonkey.me有其单独的虚拟主机。
问题
- 现在,如果https://www.thinkingmonkey.com或者https://thinkingmonkey.com被访问,
- mod_sslTLS 握手发生在mod_rewrite重写为https://thinkingmonkey.me。
- 由于证书中的通用名称属于thinkingmonkey.me,当前连接不可信任浏览器中显示警告。
- 除非我通过接受证书完成握手,否则它将不会被重定向到thinkingmonkey.me. 这很烦人。
所以,
有没有办法mod_rewrite
之前访问mod_ssl
?
或者
我是否必须购买单独的证书才能摆脱这个问题?
答案1
不是,HTTPS 是基于 TLS/SSL 的 HTTP(请参阅RFC 2818),即在发送任何 HTTP 流量之前首先建立 SSL/TLS 连接。mod_rewrite
在建立 SSL/TLS 连接后将始终适用。
不这样做实际上会造成安全问题,因为攻击者可以在证书验证之前重写并重定向客户端。即使 TLS 升级在 HTTP (RFC 2817,实际上从未使用/支持过,并且不是https
),您仍然希望重定向来自受信任的实体。
解决此问题的方法是使用具有多个主题备用名称 (SAN) DNS 条目的证书,每个主机名一个,或多个证书(在这种情况下,您可能也需要每个证书一个 IP 地址,除非您愿意使用服务器名称指示)。
答案2
不,没有办法做到这一点。考虑找一个SAN 证书包括两个名称。如果您获得 2 个证书,则需要 2 个 IP 地址。