SSL/TSL SNI
SNI(Server Name Indication)是什么
在使用TLS的时候,http server希望根据HTTP请求中HOST的不同,来决定使用不同的证书。
在使用没有使用 TLS时 服务器可以通过 http 请求中的 Host 区分用户请求的是哪个网站
但是通过 TLS 请求握手时 并不知道 Host 早期的服务器是直接返回第一个证书
就导致了 1个ip 只能绑定一个 域名的 https
这个问题是早期 SSL2.0 时就引入的一个问题,由此 SNI 协议就诞生了。SNI 协议允许客户端在发起 SSL 握手请求时,就提交请求的 Host 信息,使服务器能够切换到正确的域并返回相应的证书。
SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的 SSL/TLS 扩展。一句话简述它的工作原理就是,在连接到服务器建立 SSL 连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。目前,大多数操作系统和浏览器都已经很好地支持 SNI 扩展,OpenSSL 0.9.8 已经内置这一功能。
SNI阻断
以下内容摘自《SNI阻断与解决方案》:
在建立新的TLS连接时,客户端(如浏览器)发出的第一个握手包(称为Client Hello)中,包含了想要访问的域名信息(称为SNI,Server Name Indication)。
某些服务器会同时支持多个域名。在加密传输之前,它需要知道客户端访问的是哪个域名。于是SNI必须以明文的方式传输。并且由于浏览器并不知道服务器是否需要SNI,浏览器会对所有的TLS握手都加入SNI。
于是,根据黑名单,某些防火墙可以根据明文SNI信息,对TLS连接进行精确阻断。
解决SNI阻断
1.去除SNI
大部分解决SNI阻断的工具基本就是 去除掉 SNI 让服务端 以旧版本SSL的逻辑 提供默认证书
这需要 GFW 没有把这些网站的IP封锁 只阻断 SNI
2.域前置(Domain Fronting)
也是去除SNI或者说是替换掉SNI
SNI 写访问A网站 但是http host填写的是B 网站
cloudflare CDN就有这个功能
我自己弄的使用 cloudflare 搭建的 免翻墙 Pronhub
(原先是域前置 现在应该变成纯粹的 CDN 了Host给的也是 CDN的加速域名)
Domain Fronting的工作原理:
- 用户用合法的域名
allow.com
向DNS请求CDN的IP,然后向CDN发起请求,这一步自然是没有任何问题的- 因为在处理HTTPS请求时,CDN会首先将它解密,并根据HTTP Host的值做请求转发,所以用户想要访问一个非法网站
forbidden.com
,可以使用一个CDN上的合法的域名allow.com
作为SNI,然后使用forbidden.com
作为HTTP Host与CDN进行HTTPS通信- 由于HTTP Host只能被转发看到,而审查者是看不到的,故CDN会放过这条请求,并将HTTP请求根据HTTP Host重新封装,发往
forbidden.com
的服务器- 这种情况下,客户端实际通信的对象是
forbidden.com
,但在流量监控设备看来,客户端是在与allow.com
通信,即客户端将流量成功伪装成了与allow.com
通信的流量
ESNI(Encrypted SNI)
SNI 是明文的 会被 GFW 识别阻断 并且SPI 或任何中间代理 都可以获取到 SSL请求中的SNI 从而记录你访问的内容
ESNI 就是为了解决该问题而诞生的
ESNI(Encrypted SNI)正如其名,其设计的目标就是为了加密 SNI,是最先为解决这一问题提出的一个 TLS 拓展。虽然这一方案即将被废弃,但对于了解其后继者 ECH 有着极大的帮助。
ESNI 为了能够让客户端获得密钥发送密文,依赖于另一个服务 DNS 来分发密钥。客户端在使用 ESNI 连接服务器之前,会在常规的请求网站 IP 的 A/AAAA 请求上再进行一次 TXT 的请求以获得 ESNI 的公钥
将加密的公钥放到 记录到DNS当中 DNS必须采用 DoH(DNS over HTTPS)
DNS把公钥给到客户端后 客户端使用 公钥加密 SNI 得到 ESNI
ECH(Encrypted Client Hello)
相比 ESNI 只加密了 SNI
ECH 把 SSL中的 Client Hello 消息 整个加密了
结尾
有点圆环套圆环的感觉
SSL 通过证书信任建立了安全通信
但为了一个IP能部署多个域名 使用多个证书
SSL 引入了 SNI 来识别本次加密使用的证书
又为了加密 SNI 让 DNS 使用 DoH 加密通信 再提供一个公钥
保护本次 SSL 的 握手请求
最终 DNS 的 DoH 其实还是只能有一个证书
ESNI和ECH的普及 必定会导致 GFW 升级
一刀切把所有加密请求 和 黑名单网站的所有IP都拦截