场景:
我有2个域名: thinkingmonkey.me和thinkingmonkey.com 。 整个网站是通过https访问。 从通用名为thinkingmonkey.me的CA购买证书。
对于http :
www.thinkingmonkey.com , thinkingmonkey.com和www.thinkingmonkey.me有一个虚拟主机,并使用_mod_rewrite_规则redirect到https://thinkingmonkey.me 。
thinkingmonkey.me有其独立的虚拟主机。
一切工作正常。
https :
即www.thinkingmonkey.com , thinkingmonkey.com和www.thinkingmonkey.com有一个虚拟主机,并使用_mod_rewrite_规则redirect到https://thinkingmonkey.me 。
thinkingmonkey.me有其独立的虚拟主机。
问题
- 现在,如果https://www.thinkingmonkey.com或https://thinkingmonkey.com被访问,
- 在mod_rewrite执行https://thinkingmonkey.me重写之前, mod_ssl会发生作用,并且发生TLS握手。
- 由于证书中的通用名称是在thinkingmonkey.me中 , 因此此连接是不受信任的警告在浏览器中显示。
- 除非我通过接受证书完成握手,否则不会被redirect到thinkingmonkey.me 。 这是非常烦人的。
所以,
有没有办法在mod_ssl之前访问mod_rewrite ?
要么
我必须购买一个单独的证书来摆脱这个?
不,HTTPS是基于TLS / SSL的HTTP(请参阅RFC 2818 ),它首先在发送任何HTTPstream量之前build立SSL / TLS连接。 在SSL / TLS连接build立之后, mod_rewrite将始终应用。
不这样做实际上是一个安全问题,因为攻击者可以在证书validation之前重写和redirect客户端。 即使TLS升级是在HTTP( RFC 2817 ,它几乎从来没有使用/支持,而不是https ),你仍然希望redirect来自可信实体。
解决方法是使用带有多个主题备用名称(SAN)DNS条目的证书,每个主机名称或多个证书一个(在这种情况下,您可能还需要每个证书一个IP地址,除非您愿意使用服务器名称指示 )。
不,没有办法做到这一点。 考虑获取包含两个名称的SAN证书 。 如果您获得2个证书,则需要2个IP地址。