首页 > 其他分享 >Good-bye ESNI, hello ECH !(ESNI 与 ECH 的前世今生)

Good-bye ESNI, hello ECH !(ESNI 与 ECH 的前世今生)

时间:2023-05-30 15:23:03浏览次数:40  
标签:ESNI SNI Good 密钥 服务器 ECH 客户端

在当时介绍 TLS 的最后,提到过虽然 TLS 能够加密整个通信过程,但是在协商的过程中依旧有很多隐私敏感的参数不得不以明文方式传输,其中最为重要且棘手的就是将要访问的域名,即 SNI(Server Name Indication)。同时还有用于告知客户端可用的应用层协议的 ALPN 拓展,泄露这个会导致攻击者知道服务器所支持的服务以及连接的用途。

ech-1.png

之所以会暴露如此重要的内容,并不是设计时的失误,而是因为加密该内容会使得许多服务器无法正常工作。通常来说,一台服务器往往会提供许多服务,小到用 nginx 反向代理数个服务,大到 CDN 服务器同时为无数网站提供服务,而因为域名的不同,证书也不相同。那么当客户端访问服务的时候必须指明 SNI,服务器才知道应该返回哪个证书,但客户端收到证书前又没有办法加密,就陷入了一个先有鸡还是先有蛋的尴尬境地。ESNI 以及其后继 ECH 就是被设计出来弥补这一问题。

在了解 ESNI 与 ECH 前,最好对于 握手流程 和 TLS 1.3 有所了解

Encrypted SNI

ESNI(Encrypted SNI)正如其名,其设计的目标就是为了加密 SNI,是最先为解决这一问题提出的一个 TLS 拓展。虽然这一方案即将被废弃,但对于了解其后继者 ECH 有着极大的帮助。

ESNI 为了能够让客户端获得密钥发送密文,依赖于另一个服务 DNS 来分发密钥。客户端在使用 ESNI 连接服务器之前,会在常规的请求网站 IP 的 A/AAAA 请求上再进行一次 TXT 的请求以获得 ESNI 的公钥(实际是用 BASE64 编码后的公钥以及类似加密算法之类的参数),如下是请求某网站的结果

$ dig _esni.xxx.com TXT +short
"/wGE7aXSACQAHQAgVWE58Qfu1WOtQCxMSvjM/ve/+MRnZ/snRynvUyN3tCEAAhMBAQQAAAAAYGQd8AAAAABgbAbwAAA="

客户端会将加密后的 SNI 以拓展的形式发送。服务器收到请求后就会用对应的私钥解密,并用解密后得到 SNI 进行后续的操作。解密失败则终止连接。

ech-2.png

不过 DNS 请求本身是明文的,依旧存在风险,所以部署 ESNI 还需要引入 DoH(DNS over HTTPS)。DoH 除了保证可以加密传输公钥之外,还有一个重要的点就是可以认证 DoH 服务器,保证访问到的是正确的服务器,而非是(攻击者精心准备的)本地网络缓存,从而避免了本地缓存返回一个空的 TXT 记录以阻止客户端使用 ESNI 或者返回一个攻击者控制的密钥使得客户端使用了错误的公钥加密。

但这一方法仍然存在问题,首先就是密钥的分发,Cloudflare 在部署时每个小时都会轮换密钥,这样可以降低密钥泄露带来的损失,但是 DNS 有缓存的机制,客户端很可能获得的是过时的密钥,此时客户端就无法用 ESNI 继续进行连接。其次是对网站的 DNS 请求可能返回有几个 IP 地址,每个地址分别代表了不同的 CDN 服务器,然而 ESNI 的 TXT 记录只有一个,可能会将该密钥发送给了错误的服务器导致握手失败。

Encrypted Client Hello

ECH(Encrypted Client Hello)出现的目标就是就是为了克服 ESNI 的缺陷,同时也正如其名,ECH 有着更大的野心,不单单加密 SNI,而是要加密整个 Client Hello。

ECH 同样采用 DoH 进行密钥的分发,但是在分发过程上进行了改进。相较于 ESNI 服务器解密失败后终止连接,ECH 服务器会提供给客户端一个公钥供客户端重试连接,以期可以完成握手。

那么问题来了,解密失败服务器还是不知道 SNI 是多少,那么怎么返回公钥呢?

实际上 ECH 的 Client Hello 分为了两个部分,分别称为 ClientHelloOuter 和 ClientHelloInner,表层和里层两个部分。ClientHelloOuter 同普通的 Client Hello 消息一样,但只有连接必要的握手参数,而不包含实际想要访问的内容。真正的内容存在于 ClientHelloInner 中,其将敏感信息用密钥加密后以拓展的形式跟在 ClientHelloOuter 后面。

ech-3.png

而服务器这边,握手实际上由 ECH 服务提供者来完成(称为 client-facing server)而非域名对应的背后的服务,由它来通知客户端解密是否成功以及发送正确的 ECH 公钥。

总结

ECH 是将会是 TLS 的又一次重大升级,这一次使得每次连接除了其发起者和接收者之外,没有人能够知道访问的是什么,有助于进一步保护用户隐私。尽管 ECH 还是一项进行中的工作,但随着工作的继续,显然我们离更安全的互联网又近了一步。

参考文档
Good-bye ESNI, hello ECH !

(转载自:https://zinglix.xyz/2021/04/03/esni-ech/

标签:ESNI,SNI,Good,密钥,服务器,ECH,客户端
From: https://www.cnblogs.com/hdu-2010/p/17443346.html

相关文章

  • echarts——环形图,异步请求数据后,有数据但图不显示
    echats官网:https://echarts.apache.org/ 我的原因:series里的data数据,需要是value,name格式,我的后台返回的数据是{number:1,typeName:'1'}解决方法:做下转换res.result.forEach(item=>{item.name=item.typeName;item.value=item.number;}) ......
  • Echarts 阴影点击事件获得当前柱状图的索引值方法
    Echarts阴影点击事件获得当前柱状图的索引值方法//什么在option外面的变量varclickIndex;option={//配置信息tooltip:{//提示框//提示触发类型:不触发trigger:'none',},//formatter回调函数,formatter:val=>{......
  • echarts堆叠柱状图上方展示两个数据项的总和
        //当月漏项统计排名getIndicatorCurve(data1){echarts.init(document.getElementById('lineOption5')).dispose()//销毁实例//找到容器letmyEcharts=echarts.init(document.getElementById('lineOption5'),......
  • echarts爆错invalid dom
    错误截图 错误原因:将初始化echarts的方法放在了created中,解决:将其放在mounted中 ......
  • FLEX实践—PieChart综合应用(颜色渐变、显示选中值、选中部分突出、数据钻探等)
    代码如下:(代码中附加了注释,每一种方法对应的效果均有注释)<?xmlversion="1.0"encoding="utf-8"?><mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Scr......
  • PGP (Pretty Good Privacy) 或 GnuPG (GNU Privacy Guard)
    使用PGP(PrettyGoodPrivacy)或GnuPG(GNUPrivacyGuard)为文件生成密钥验证,通常需要3个步骤:首先创建一对PGP密钥(公钥和私钥),其次为文件生成签名,最后验证文件签名。1.创建PGP密钥对(公钥和私钥):如果您尚未拥有PGP密钥对,请执行以下命令生成一对新密钥:```......
  • Python竖版大屏2 | 用pyecharts开发可视化的奇妙探索!
    目录1、SHINE主题2、LIGHT主题3、MACARONS主题4、INFOGRAPHIC主题5、WALDEN主题6、WESTEROS主题7、WHITE主题8、WONDERLAND主题你好!我是@马哥python说,一名10年程序猿,正在试错用pyecharts开发可视化大屏的非常规排版。以下,我用8种ThemeType展示的同一个可视化数据大屏,可视化主题......
  • echart 隐秘的坑 => 传值类型
    前言最近整个大屏项目,期间遇到奇葩的问题:如下代码,发现legend的icon与文字老是有一段距离,也没报错legend={data:series.map(i=>i.name),//data:['预计曲线','实际曲线'],icon:'rect',right:'14',it......
  • SimpleChannelInboundHandler
    在Netty中,SimpleChannelInboundHandler是一个抽象类,用于处理入站消息(InboundMessages)。它是ChannelInboundHandlerAdapter的子类,为简化消息处理提供了方便的实现。SimpleChannelInboundHandler的主要作用是处理接收到的消息,并提供一种方便的方式来释放资源。它使用了泛型,可以指......
  • ubuntu系统安装的firefox浏览器 echarts图表显示有问题,但是window版的firefox浏览器是
    如果在Ubuntu系统上安装的Firefox浏览器不能正确显示ECharts图表,有几种可能的原因和解决方法:1.缺少字体在Ubuntu系统中,可能会缺少浏览器所需的字体文件,导致无法正确显示图表。可以通过以下命令安装所需的字体:```sudoapt-getinstallttf-wqy-zenhei```安装后,重启Fi......