SNI干扰(或者说是检测/重置)的原理是读取SNI中包含的明文的域名,因为目前TLS的SNI扩展标准中SNI信息是不加密的。
自签名证书,准确地说是本地自签名证书,基本思路非常简单,就是不发送SNI,也就是使用了TLS标准订立但SNI扩展还没有提出时的策略:服务器对其所托管的所有域名签在一个证书里。
但是现在SNI的广泛普及导致了大多数TLS客户端(下载工具/浏览器等)不会不发送SNI。所以就有了本地做反向代理把客户端的SNI“剥掉”的方法。
- 将目标域名的IP指向本地搭建的反向服务器;
- 本地反向服务使用对目标域名进行签名的证书;
- 在本地服务的上游访问中关闭发送SNI。
这个方法成立的前提是目标服务器的IP提供了无SNI兼容,wikipedia和tumblr等都可以,但托管在cloudflare反向代理的网站基本上是不行的。
在浏览器中访问
https://<目标域名的IP>/
如果显示证书错误就说明可行,而如果是SSL_ERROR_NO_CYPHER_OVERLAP就不行。
P.S. cloudflare意图推广的是现在仍处于草案阶段的ESNI,即加密SNI,目前正逐步在其DNS服务器(1.1.1.1)及其托管的域名启用该方案。就是从它的DNS服务器获得它的IP访问它提供的数据。说得难听点,被骗了都不知道。