简述
SNI 在 TLS 握手的 ClientHello 消息中添加了一个字段,明确指出客户端希望连接的主机名(域名)。这样,服务器就可以根据这个主机名选择正确的证书进行响应,从而正确完成 TLS 握手。
但是很不幸的是,国内的长城防火墙(GFW)通过没有加密的SNI字段确认了流量包的最终去向。从而得以实现拦截访问。并且经过我之前的实现,确定了SNI阻断就是限制国内无法访问Github的主要原因。
原理
既然是因为SNI字段记录的域名位于长城防火墙中的黑名单才导致的访问受阻,那么自然,只需要将SNI字段修改为一个不在黑名单的域名即可。一般的浏览器,我们在地址栏输入域名,然后浏览器做两件事:
解析DNS(host,dns服务器),确定域名所指向的服务器的地址。
将域名填写到SNI字段,从而让目标服务器返回正确的证书。
前者是访问服务的基本步骤,后者是导致连接被长城防火墙终止的原因,所以只要我们保留1,但是将2修改为一个不敏感的域名即可,但是正常使用浏览器的过程中我们并没有办法让1发生的同时不发生2,因为这个逻辑是写死在浏览器的二进制文件中的。
我们换一个思路,假如浏览器访问了一个在白名单中的域名(white.net),我们是否有办法强行让这个域名解析到我们实际访问的(target.net)所在服务器,显然修改host文件就可以了。这样做,当我们访问white.net的时候,就相当于访问了target.net,但是对于运行了target.net网站的服务器而言,他会在SNI字段看到white.net,这个并不在他服务器上运行的服务。
巧妙就巧妙在这里了,很多的网站对于不匹配的SNI字段的流量包的处理并不是终止连接,而是发送了一个不匹配的通用证书,服务器自己并不主动终止连接,而是当客户端发现了不匹配的证书的时候,提示用户HTTPS证书错误。现代浏览器对于HTTPS证书错误的标准处理就是终止连接。
而巧合的地方又出现了,现代浏览器对于HTTPS证书错误的处理是可以通过启动参数调整的,或者说,可以创建一个统配一切网站的证书,计算机手动添加到 “受信任的证书“ 浏览器此时就不会中断连接。
实现
下面的所有实现方式本质上都是调整浏览器的行为,还有一种是通过代理节点实现,比如 dev-sidecar 这里我就不做介绍了,核心思路都是一样的。
--host-rules="MAP e-hentai.org Megumin, MAP exhentai.org Eris" --host-resolver-rules="MAP Megumin 104.20.134.21, MAP Eris 178.175.129.252" --test-type --ignore-certificate-errors在上述参数中,首先通过--host-rules参数将发送给e-hentai.org和exhentai.org的请求改为发送给Megumin和Eris,从而避开GFW对SNI的检查;然后通过--host-resolver-rules参数将Megumin和Eris解析到e-hentai.org和exhentai.org的IP地址上面,确保连接到目标服务器;最后通过--ignore-certificate-errors参数来忽略因域名错误而导致的证书错误(一些工具通过自签证书来实现这一点比如 “dev-sidecar”)
使用-1
通过启动参数来运行某个Chromium系列浏览器前,应确保已经关闭所有的这一Chromium系列浏览器,否则启动参数将不会生效。
找到浏览器的快捷方式,
右键 → 属性 → 快捷方式 → 目标,在路径后面空一格,然后贴入所需启动参数即可。之后每当通过此快捷方式运行浏览器时,都会添加相应的启动参数。
使用-2
直接编辑快捷方式时会受到字符长度的限制,而且维护起来也比较麻烦。如果想要直连的网站很多,可以考虑通过命令行来添加启动参数。
通过命令行来添加启动参数。将下面的内容保存为bat文件放于浏览器快捷方式目录下
@start .\"Google Chrome.lnk" --host-rules="MAP e-hentai.org Megumin, MAP exhentai.org Eris" --host-resolver-rules="MAP Megumin 104.20.134.21, MAP Eris 178.175.129.252" --test-type --ignore-certificate-errors其中,可以把
Google Chrome.lnk修改为你正在使用的Chromium系列浏览器的快捷方式的文件名,如Microsoft Edge.lnk等。完成后,保存文件,将这个文本文档的后缀修改为bat,把它与你的浏览器的快捷方式放在相同的目录下。此后只需要运行这个文件,即可打开添加了启动参数的浏览器。可以从下面的网址获得IP地址
https://www.diggui.com/
使用-3
直接使用工具,开源地址:github.com/SpaceTimee/Sheas-Cealer 这个开源软件就是将调整浏览器启动参数封装到软件中了,软件自动调用浏览器并且附加需要的启动参数。
局限
上边的流程得以跑通的前提就是,服务器并对于不匹配的SNI字段的流量的处理是发送一个并不匹配的证书而不是直接终止连接,并且还需要注意到一点,如果服务器上有反向代理,并且运行了多个服务,那么通常这种情况下,错误的SNI将导致反向代理无法进行,进而无法建立连接。
评论