我有一个通配符 SSL 证书*.example.com
。
我正在使用 Nginx,并将所有 HTTP 流量重定向到 HTTPS,同时重写 URL 以删除 www 子域(如果有)。
所以,
http://subdomain.example.com
--->https://subdomain.example.com
http://www.subdomain.example.com
--->https://subdomain.example.com
https://www.subdomain.example.com
--->https://subdomain.example.com
https://subdomain.example.com
--->https://subdomain.example.com
但是,由于我的证书是*.example.com
,情况 3 在 chrome 中会出现 SSL 错误(“这可能不是您正在寻找的网站!”),但如果您点击它,它会被重定向,一切正常。
我明白原因,因为初始连接是带有 www(2 级子域)的 HTTPS,这与通配符证书上的内容不匹配。
我认为解决方案是获得额外的证书以*.*.example.com
覆盖www.*.example.com
。但这似乎行不通。我与 Namecheap 和 Comodo 的代理商进行了交谈,他们都说这*.*.example.com
是不可能的。
我也遇到了本文其中指出:
SSL 可以与多级通配符一起使用吗?
随着 Firefox 3.5 的发布,所有主流浏览器都只允许单级子域名匹配包含通配符的证书名称,以符合 RFC 2818 的规定。
换句话说,该证书对或
*.mydomain.com
有效,但对 无效。one.mydomain.com
two.mydomain.com
one.two.mydomain.com
有办法解决这个问题吗?能够覆盖吗www.*.example.com
?
答案1
通配符证书只能深入一层。您需要获取一个通配符,该通配符还具有所有www.<subdomain>.example.com
网站的主题替代名称。这将允许重定向发生。
除了在两级深度子域上放置有效证书之外的任何解决方案都行不通,因为 SSL 握手总是在任何重定向或重写之前发生。
答案2
一个小的解决方法是在建立 SSL 连接之前重写 URL,但你永远不会得到https://www.subdomain.mydomain.com在您获得此域名的证书之前,不会出现任何警告。如下所示:
server {
listen 111.222.333.444:80;
server_name www.subdomain.mydomain.com;
rewrite ^ https://$host$request_uri permanent;
}
server {
listen 111.222.333.444:443
server_name subdomain.mydomain.com
ssl on;
...
}
答案3
问题在于通配符证书的工作方式。正如您所看到的,它们只适用于一级子域。要解决这个问题,您需要使用 PTR 记录将 www.subdomain.domain.com 指向 subdomain.domain.com,并且它对服务器应该是不可见的。