因为 HTTP 的内容是明文传输的,明文数据会经过代理服务器、路由器等多个物理节点,数据被人窃取的风险大。如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者甚至可以篡改传输的信息且不被双方察觉,也就是中间人攻击。所以需要对信息进行加密。
HTTPS 在 HTTP 和 TCP 之间引入了 TLS 层,双方仍然通过 TCP 进行传输,但 TCP 数据不是直接交付给 HTTP 应用层,而是先交付给 TLS 层,在 TLS 握手过程中会交换密钥/校验证书等,TLS 握手完成之后,所有数据都是加密传输的了,所有数据都是加密的,中间即便被截获也无法得到明文数据。
下面就一步步来揭开 HTTPS 的神秘面纱,希望能帮助你加深对 HTTPS 的理解。
文章中图片均引用:彻底搞懂 HTTPS 的加密原理
对称加密只有一个密钥,用这个密钥对数据进行加密,同时也用该密钥对数据解密。

非对称加密有两个密钥,一个叫做公钥、一个叫做私钥。一般而言,公钥是全世界公开的,私钥是自己保存的。
这时可以用一个密钥加密,另一个密钥解密。给对方发消息时,通常用对方的公钥进行加密,此时只有对方能用自己的私钥解密获取到数据。

发送方在发送数据时,用自己的私钥对数据加密,形成一份数字签名和数据一起发送。接受方在收到的时候,用发送方的公钥对数字签名进行解密,然后与数据进行对比。如果解密后的数据与发送过来的明文数据不相同,则说明数据被人篡改了。
上述方式还有一个问题,原始数据加密后形成的数据可能很大,传输浪费时间。因此可以先对数据做哈希运算,对哈希运算的结果用私钥加密,接收方收到后用公钥解密,比较哈希值即可。

上述问题的关键是:浏览器无法确定收到的公钥是网站给自己发送的。

由此诞生了互联网世界的公理 CA 机构,他来证明各个网站合法的身份。
网站在使用 HTTPS 前,需要向 CA 机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。
明文信息 T 和数字签名 S 共同组成了数字证书,这样一份数字证书就可以颁发给网站了。

中间人有可能篡改该证书吗?
假设中间人篡改了证书的原文,由于他没有 CA 机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。
若仅修改证书明文 T,没修改加密后的数字签名 S,浏览器收到该证书后会发现证书原文 T 经过 hash 后和签名解密后的值不一致,则说明证书已篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。
中间人有可能把证书掉包吗?
假设有另一个网站 B 也拿到了 CA 机构认证的证书,它想劫持网站 A 的信息。于是它成为中间人拦截到了 A 传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到 B 的证书里的公钥了。
其实这并不会发生,因为证书里包含了网站 A 的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉了。
中间人可能篡改网站发送的数据吗?
由上文可知,中间人无法篡改数字证书的任何东西,那么他可以只篡改网站发送的数据吗?
通过开始部分的知识,我们知道,在发送数据时,可以用自己的私钥对发送的明文数据生成一份加密的数字签名。同理浏览器在收到网站发来的数据时,用网站的公钥对发来的数据的数字签名解密,用解密后的数据和明文数据进行对比,就可以知道数据是否被篡改了。
怎么证明 CA 机构的公钥是可信的?
CA 机构也可以用数字证书来证明身份,一些知名的网站的证书是在 OS 和浏览器中内置的。而且实际上证书之间的认证也可以不止一层,可以 A 信任 B,B 信任 C,以此类推,我们把它叫做信任链或数字证书链。也就是一连串的数字证书,由根证书为起点,透过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。
