前两天还看到不少推文,大意是:
看小电影前一定要注意网址是不是 HTTPS 的,因为 HTTPS 是加密的,别人就不知道了
。
看到上面几个问题,我不禁想问(这脑回路也是……):
总之就是,上班时间上网摸鱼吗?哪怕用 HTTPS 访问,如果公司知道,是通过什么手段?
本文谈谈我的看法,主要分为以下几个方面:
HTTPS,也称作 HTTP over TLS,TLS 前身是 SSL,会有各个版本。
TLS 协议在 TCP/IP 协议栈中的关系
上图描述了在 TCP/IP 协议栈中 TLS(各子协议)和 HTTP 的关系,HTTP+TLS 也就是 HTTPS。
上图就是大致介绍了 HTTPS 的握手流程,感兴趣的同学可以用 WireShark 抓包详细看看其中的每一个步骤,有助于理解 HTTPS 的完整流程。这里,我就不详述了。
大致就是客户端和服务端通过“握手会谈”商量出一个双方支持的加密算法和相应随机参数,得到一对密钥,后续的传输的内容都通过这对密钥进行加解密。
这对密钥很牛皮,比如要加密传输消息『tangleithu』,客户端通过公钥加密得到的密文『xyyaabbccdd』进行传输,服务端用自己的私钥对密文解密,恰好能得到『tangleithu』。
中间错一位都不行,这样就保证了数据完整和隐私性。这个过程比较复杂,本文不详述。
因此,你在通过 HTTPS 访问网站的时候,就算流量被截取监听,获取到的信息也是加密的,啥实质性的内容也看不到。
例如,如下图所示,当我访问某个网站,此时通过 wireshark 抓包得到的信息,能获得仅仅是一些通信的 IP 地址而已。
这下放心了吗?摸鱼的过程中,就算访问的 IP 地址被知道了,好像也无关紧要?其实,有了 IP 地址也能获取不少信息了。
还好这个 IP 搜出来是 Github,而不是……
你或许会高兴,连个网站域名都看不到,可以放心摸鱼了。不过,这是真的吗?
HTTPS 真的完全安全吗?连访问的域名都获取不到?答案是否定的。上述 HTTPS 在握手阶段有一个很重要的东西:证书。
当访问 HTTPS 站点时,会首先与服务器建立 SSL 连接,第一步就是请求服务器的证书。
当一个 Server IP 只对应一个域名(站点)时,很方便,任意客户端请求过来,无脑返回该域名(服务)对应的证书即可。
但 IP 地址(IPv4)是有限的呀,多个域名复用同一个 IP 地址的时候怎么办?
服务器在发送证书时,不知道浏览器访问的是哪个域名,所以不能根据不同域名发送不同的证书。