现在的 web 网站使用 HTTPS 已经是主流,浏览器也无时无刻不在提醒用户不要访问 HTTP 网站。最近碰到一个比较少见的 CORS 问题,本来以为是 DNS 解析的问题,没想到实际上是浏览器在阻拦 HTTP 网站的运行。
问题表现
用户反馈网站登录不上去,我本能想到是 DNS 解析错误,因为我们的系统登录实现是引用统一的认证系统 js 文件实现的,在公网下这个 js 是解析出公网 IP,而登录公司的 VPN 工具后,js 文件会解析到内网地址。有时 VPN 有 bug,已经登出无法连接内网了,DNS 依然在按内网解析,就访问超时了。
远程登录用户电脑一看,还不是这个问题,浏览器直接报了 CORS 错误,阻断了对 js 的请求,同样的问题也出现在 Microsoft Edge,FireFox 没有问题。

这个问题以前没见过,还是首次有人反馈,先尝试退出公司的 VPN,问题没有复现。但是用户不登录 VPN 的话,登录系统就需要输入验证码,这个很多用户都反馈过很麻烦,所以还得找个更好的解决方法。搜索后得到解决方案,在 Chrome 地址栏输入 chrome://flags/
,搜索 Block insecure private network requests.
,将配置值 Defualt
改为 Disabled
。
排查原因
IT 服务台说这个问题不是个例,已经有不少用户反馈问题了,于是继续往下找问题的根源。
首先想到是不是和这个请求用的 HTTPS 有关,尝试控制台修改 html 文件,使用 HTTP 请求 js 文件,还是出现一样的错误。

再考虑是不是浏览器版本不正确,查看 Chrome 版本,是最新版的94.0.4606.61
。
无奈先回到自己电脑,结果完全相同的情况下居然没有复现这个问题。查看自己电脑的 Chrome,是 93 版本的,很自然想到可能和浏览器版本有关。
打开 Chrome 的更新日志,搜索了下 CORS 内容,没看到有 94 版本相关的信息,转到 Chrome 的 Bug 提交页面,搜索 CORS,很快找到了相同的问题。 内容大意说 94 版本开始,全面阻止不安全公共网站的私有网络请求,详情可见 Chrome 的开发者博客。
网络疑问
但是这个又引入了一个问题,在公司网络访问认证系统域名,得到的会是一个内网代理的 IP,这和登录 VPN 以后,得到另一个内网 IP 不是一个性质的吗,为什么 VPN 的 IP 不能访问,内网代理又可以呢。

再不断尝试和仔细查看开发者博客的说明后,得到结论,Chrome 拦截的描述是:
Blocking requests to private networks from insecure public websites starting in Chrome 94.
关键就在这个 private networks(专用网络)上。
在正常上网的情况下,即使有内网代理,也只是 DNS 上的控制,Windows 网络情况其实很简单,只有一个 WiFi 连接。

而当使用公司 VPN 以后,就会多出一个虚拟网卡,构建一个专用网络。

程序员一定要学好英语啊,常用的英文缩写也要知道其原句,就比如这个 VPN(Virtual Private Network)。如果知道原句的话,直接就和开发者博客里的 private networks(专用网络)对上了,也不会在内网问题上纠结。
如何修复
查到了问题原因以后,自然是想办法修复了,使用 Firefox、国产浏览器,修改 Chrome 配置之类的都是下下之策,时间成本不低,还要强行改变用户习惯。
真正解决问题的办法是把网站改成 HTTPS,这种开放了公网访问的系统,居然还在用 HTTP,在这个时代也是一朵奇葩了,只能说外包系统多奇志。
总结
在谷歌等巨头的强力推行下,HTTPS 的潮流已经不可逆,正如前文所说,当 Microsoft Edge 也在使用 chromium 内核,互联网上留给 HTTP 网站的生存空间越来越小。
谷歌的报告说 95% 的流量已经通过 HTTPS,看来网站的开发者们,已经接受了这一规则。
发表回复