Olá a todos, eu sou Carson.
Recentemente, um cara que acabou de entrar no grupo foi entrevistado porque usou um computador da empresa para visitar um site estranho. Ele estava muito confuso - todos os sites que ele visitou HTTPS
, como a empresa sabia o que ele visitava?
Na verdade, como existem muitas camadas de comunicação de rede, mesmo com comunicação criptografada, ainda existem muitas maneiras de expor seu endereço de acesso, como:
-
DNS
Consulta: Normalmente,DNS
a consulta não é criptografada, portanto,DNS
observadores (como operadores) que podem ver sua consulta podem inferir o site visitado -
IP
Endereço: Se oIP
endereço de um site for único, é possívelIP
inferir qual site um usuário está visitando apenas vendo o endereço de destino. Obviamente, esse método não é bom para a situação em que vários sites compartilham o mesmoIP
endereço (por exemploCDN
) -
Análise de tráfego: ao visitar páginas específicas de alguns sites, pode resultar em pacotes de tamanho e ordem específicos, esse padrão pode ser usado para identificar o site visitado
-
cookies
ou outro armazenamento: se o seu navegador tiver um determinado sitecookies
, isso obviamente significa que você visitou o site e outras informações armazenadas (comolocalStorage
) são as mesmas
Além disso, existem muitas maneiras de saber direta e indiretamente as visitas do seu site.
Este artigo se concentrará HTTPS
no protocolo em si e falará sobre HTTPS
como sua privacidade vaza quando apenas o protocolo é considerado.
Bem-vindo a assistir ao círculo de amigos, junte-se ao grupo de seres humanos de comunicação de front-end de alta qualidade e assuma a liderança
Introdução ao HTTPS
A maioria dos sites que visitamos todos os dias são HTTPS
baseados em protocolo, simplesmente, HTTPS
= HTTP
+ TLS
, onde:
-
HTTP
é um protocolo de camada de aplicativo para transmissão de hipertexto (como conteúdo da Web) pela Internet. ComoHTTP
é transmitido em texto simples, não é seguro -
TLS
是一种安全协议。TLS
在传输层对数据进行加密,确保任何敏感信息在两端(比如客户端和服务器)之间安全传输,不被第三方窃取或篡改
所以理论上,结合了HTTP
和TLS
特性的HTTPS
,在数据传输过程是被加密的。但是,TLS
建立连接的过程却不一定是加密的。
TLS的握手机制
当我们通过TLS
传递加密的HTTP
信息之前,需要先建立TLS
连接,比如:
-
当用户首次访问一个
HTTPS
网站,浏览器开始查询网站服务器时,会发生TLS
连接 -
当页面请求
API
时,会发生TLS
连接
建立连接的过程被称为TLS握手,根据TLS
版本不同,握手的步骤会有所区别。
但总体来说,TLS握手是为了达到三个目的:
-
协商协议和加密套件:通信的两端确认接下来使用的
TLS
版本及加密套件 -
验证省份:为了防止“中间人”攻击,握手过程中,服务器会向客户端发送其证书,包含服务器公钥和证书授权中心(即
CA
)签名的身份信息。客户端可以使用这些信息验证服务器的身份 -
生成会话密钥:生成用于加密接下来数据传输的密钥
TLS握手机制的缺点
虽然TLS
握手机制会建立安全的通信,但在握手初期,数据却是明文发送的,这就造成隐私泄漏的风险。
在握手初期,客户端、服务端会依次发送、接收对方的打招呼信息。首先,客户端会向服务端打招呼(发送client hello信息),该消息包含:
-
客户端支持的
TLS
版本 -
支持的加密套件
-
一串称为客户端随机数(
client random
)的随机字节 -
SNI
等一些服务器信息
服务端接收到上述消息后,会向客户端打招呼(发送server hello消息),再回传一些信息。
其中,SNI
(Server Name Indication
,服务器名称指示)就包含了用户访问的网站域名。
那么,握手过程为什么要包含SNI
呢?
这是因为,当多个网站托管在一台服务器上并共享一个IP
地址,且每个网站都有自己的SSL
证书时,那就没法通过IP
地址判断客户端是想和哪个网站建立TLS
连接,此时就需要域名信息辅助判断。
打个比方,快递员送货上门时,如果快递单只有收货的小区地址(IP
地址),没有具体的门牌号(域名),那就没法将快递送到正确的客户手上(与正确的网站建立TLS
连接)。
所以,SNI
作为TLS
的扩展,会在TLS
握手时附带上域名信息。由于打招呼的过程是明文发送的,所以在建立HTTPS
连接的过程中,中间人就能知道你访问的域名信息。
企业内部防火墙的访问控制和安全策略,就是通过分析SNI
信息完成的。
虽然防火墙可能已经有授信的证书,但可以先分析
SNI
,根据域名情况再判断要不要进行深度检查,而不是对所有流量都进行深度检查
那么,这种情况下该如何保护个人隐私呢?
Encrypted ClientHello
Encrypted ClientHello(ECH
)是TLS
1.3的一个扩展,用于加密Client Hello
消息中的SNI
等信息。
当用户访问一个启用ECH
的服务器时,网管无法通过观察SNI
来窥探域名信息。只有目标服务器才能解密ECH
中的SNI
,从而保护了用户的隐私。
当然,对于授信的防火墙还是不行,但可以增加检查的成本
开启ECH
需要同时满足:
-
服务器支持
TLS
的ECH
扩展 -
客户端支持
ECH
比如,cloudflare SNI测试页支持ECH
扩展,当你的浏览器不支持ECH
时,访问该网站sni
会返回plaintext
:
对于chrome
,在chrome://flags/#encrypted-client-hello中,配置ECH
支持:
再访问上述网站,sni
如果返回encrypted
则代表支持ECH
。
总结
虽然HTTPS
连接本身是加密的,但在建立HTTPS
的过程中(TLS
握手),是有数据明文传输的,其中SNI
中包含了服务器的域名信息。
Embora SNI
a intenção original da informação seja resolver o problema de implantar vários sites sob o mesmo IP, e cada site corresponder a um certificado SSL diferente , também vazará o endereço do site visitado .
ECH
Ao criptografar TLS
informações confidenciais (principalmente) durante o aperto de mão , ele fornece proteção de privacidade mais forte para os usuários.SNI