大家好,我卡颂。
最近,群里一个刚入职的小伙因为用公司电脑拜访奇怪的网站,被约谈了。他很困惑 —— 拜访的都是HTTPS
的网站,公司咋知道他拜访了啥?
实际上,因为网络通讯有很多层,即便加密通讯,仍有很多途径露出你的拜访地址,比方:
-
DNS
查询:通常DNS
查询是不会加密的,所以,能看到你DNS
查询的观察者(比方运营商)是能够推断出拜访的网站 -
IP
地址:假如一个网站的IP
地址是独一无二的,那么只需看到目标IP
地址,就能推断出用户正在拜访哪个网站。当然,这种方法关于多网站共享同一个IP
地址(比方CDN
)的状况不好使 -
流量分析:当拜访一些网站的特定页面,可能导致特定巨细和顺序的数据包,这种形式可能被用来辨认拜访的网站
-
cookies
或其他存储:假如你的浏览器有某个网站的cookies
,显然这代表你曾拜访过该网站,其他存储信息(比方localStorage
)同理
除此之外,还有很多方法能够直接、直接知道你的网站拜访状况。
本文将聚焦在HTTPS
协议自身,聊聊只考虑HTTPS
协议的状况下,你的隐私是如何泄露的。
欢迎围观朋友圈、加入人类高质量前端沟通群,带飞
HTTPS简介
我们每天拜访的网站大部分是根据HTTPS
协议的,简单来说,HTTPS
= HTTP
+ TLS
,其中:
-
HTTP
是一种应用层协议,用于在互联网上传输超文本(比方网页内容)。因为HTTP
是明文传递,所以并不安全 -
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
中包括了服务器的域名信息。
尽管SNI
信息的本意是处理同一IP下布置多个网站,每个网站对应不同的SSL证书,但也会走漏拜访的网站地址。
ECH
经过对TLS
握手进程中的灵敏信息(主要是SNI
)进行加密,为用户供给了更强的隐私保护。