你的steam社区为什么打不开?科普

什么是SNI (Server Name Indication)?

SNI是TLS握手过程中的一个扩展,允许客户端指定它试图连接到的服务器的主机名。

这是因为一台服务器(比如CDN服务器)可能托管多个域名。

而SNI让服务器知道客户端想要连接到哪个域名,从而返回正确的证书。

SNI信息在TLS握手的ClientHello消息中发送,这是在加密通道建立之前。

由于浏览器并不知道服务器是否需要 SNI,浏览器会对所有的 TLS 握手都加入 SNI。

什么是SNI阻断?

由于SNI信息是明文传输的(即使后续的通信是加密的),某些系统会检查TLS握手中的SNI字段。

如果SNI字段中的值与一个被禁止或被限制的列表匹配,这些系统可能会中断或阻断连接。


Mozilla 和 CloudFlare 主导了一项对 SNI 的改进方案,称为 Encrypted SNI (ESNI),后继续改进命名为ECH。

Cloudflare于2013年10月开启ECH,然后火速被下线。

但是补上当初TLS 设计中的这个缺陷(明文SNI),仍然是大势所趋。


为什么本地反代可以访问steam社区?

当你使用本地反向代理时,你实际上是在你的本地机器上创建一个服务器。

你的应用或浏览器首先连接到这个本地代理,而不是直接连接到steam服务器。

本地反代服务器(借助nginx的请求)把server_name这个字段值删掉或者改成别的字段,就顺利访问steam社区了。


参考:

https://www.zhihu.com/question/557457429

https://zhuanlan.zhihu.com/p/411165246

https://steemit.com/cn/et1672te7

https://www.cloudflare.com/zh-cn/learning/ssl/what-is-encrypted-sni/

分享你的喜爱

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注