
史上最好懂的HTTPS原理(深度图解)
一、为什么会出现 HTTPS
1.1 HTTPS 的前身
想要了解为什么会出现 HTTPS,我们必须得先清楚 HTTPS 的前身:HTTP
当我们在浏览器中输入 URL 地址访问某个网站时,浏览器会向服务端发送一系列请求,服务端在接收到这些请求后会根据这些请求做出相应的处理,并将处理后的结果传回给浏览器,浏览器在接收到数据后经过一系列的操作,最终以 web 页面形式在浏览器中渲染出来,即我们所看到的网站页面。
在整个过程中,发送请求的浏览器被称为:客户端。处理请求的服务器被称为:服务端。
这些在客户端和服务端之间传递的数据并不是杂乱无章的,而是遵循着一定的规则和标准。
例如:
客户端以何种请求方法:GET、POST、PUT、DELETE
客户端发送的请求中应该包含哪些信息,以及这些信息以何种方式进行传输
服务端处理完请求后返回给客户端的状态码信息。
而这一系列规则和标准便是超文本传输协议(Hyper Text Transfer Protocol),也就是我们常说的 HTTP 协议。
世界上绝大多数的 Web 服务都是基于 HTTP 协议的,可以说,HTTP 协议是现代互联网发展的基石,它在整个互联网的发展中起着举足轻重的地位。
接下来我们来看看 HTTP 的传输流程。
1.2 HTTP 的传输流程
我们这里先了解一下 HTTP 协议数据的传输流程。
首先数据从应用层发出并携带对应的 HTTP 请求头
然后经过传输层处理再一层层往下传递封装,最终封装成数据帧。
封装后的数据报文在网络中来回奔波最终找到目标服务器
目标服务器接收数据报文逐层解封,最终得到数据
1.3 HTTP 的裸露风险
但就是这样一个作为基石的协议却存在一些令人发狂的缺陷,其中最令人诟病的就是它的安全性问题。所有基于 HTTP 协议传输的数据在互联网中全都是以明文形式传播的(仿佛一个人赤身裸露在大街上,所有东西一览无遗)。这也意味着,无论是谁都可以随意的窃取、监听、篡改网络中的 HTTP 数据。
下面两幅图非常直观的展现了的 HTTP 在网络传输中所存在的安全缺陷。
缺陷一:在网络传输过程中,用户的隐私数据容易被窃取
缺陷二:在网络传输过程中,通信双发之间的信息容易被监听和篡改
正是上述 HTTP 存在的安全性问题,人们引入了 HTTPS 协议,其中的 S 就代表了 Secure 即安全。
那么 HTTPS 是如何保证数据传输过程中数据的安全性呢?
答案是:加密。
二、TLS & 会话加密(对称加密)
在 HTTPS 中对上述的 HTTP 数据传输过程进行了改进,在应用层和运输层之间添加一层 TLS 层,用于数据加密。
那么,什么是 TLS,它有什么用?
TLS 是专门用于对数据进行加密和解密操作的,当客户端产生数据后,数据在经过应用层和传输层时还会经过一层 TLS 加密层,加密后的数据再经由下层结构,发送到网络中到达最终服务器。数据在经过 TLS 层后,在会对数据进行解密。由于此时在网络中数据都是经过加密后的数据,所以即使黑客窃取了数据,也是加密后数据。
那么什么是 TLS 协议呢?它又是如何实现数据加密和解密操作的呢?
TLS(Transport Layer Security):传输加密协议,规定了如何为网络中传输的数据进行加密和解密。
这里也许有小伙伴会疑惑,SSL 是什么?它和 TLS是什么关系呢?
这里我们来拓展一下,SSL(Secure Socket Layer)是 TLS 的前身是早期的加密协议,后贡献给 IETF 组织,并最终重名为 TLS,我们可以直接将 SSL 看做 TLS 或者将二者对等
这里在来扩充一个问题,TLS 只有 HTTPS 使用吗?
其实如果我们知道了 TLS 所处在网络体系结构中的位置的话,这个问题就很好解答。TLS 加密层介于应用层和传输层之间,TLS 可以被应用于任何基于 TCP/IP 协议的上层协议或者应用程序,如 SFTP 协议,SMTP 协议,数据库间的加密通信等等。
那么 TLS 又是以何种方式对数据进行加密和解密的呢?
答案是对称加密(Symmetric Encryption)。所谓对称加密是指通讯双方根据协商好的算法生成一个唯一秘钥,该秘钥将同时用于对数据进行加密和解密操作。
但是我们再来思考一个问题:上述过程真的能确保数据传输的安全吗?
答案是否定的。虽然上述使用了对称加密的方式实现了数据的加密,黑客在窃取数据时窃取到的是加密后的数据,但仍然有办法破解。
在使用对称加密加密之前,客户端需要将生成的预主密钥(一串随机字符串)传送给服务端,黑客完全可以截获秘钥发送的这段数据报文,解密出其中的预主密钥和加密算法,后续通过该预主密钥解密被加密的数据,仍然可以达到对应的目的。
三、PKI 非对称加密
为了解决上述对称加密存在的安全性问题,我们引入了非对称加密(Asymmetric Encryption)与对称加密不同的是,非对称加密包含两个不同的密钥文件:公钥和私钥
公钥:公钥对外公开,用于加密,任何人都可以随意获取
私钥:私钥保密,只有拥有者自己知道
这种公私秘钥的加密方式也被称为 PKI(Public Key Infrastructure)
非对称解密是如何解决预主密钥被截获的问题的?
非对称加密是在服务端返回【TLS 版本+加密算法】的同时还会将公钥返回给客户端,客户端使用公钥加密预主密钥。将加密好后的预主密钥返回给服务端,服务端通过自己的私钥解密出预主密钥。最终实现了预主密钥的保护。
我们继续思考,这种方式虽然保护了预主密钥不被破解,但真的万无一失了吗?
不知道大家是否看过碟中谍,里面有一种换脸的操作,不到最后一刻你永远不知道你面对的究竟是谁。同理,虽然我无法破解你们之间的预主密钥,但是我可以伪装成服务端,这时阁下又该如何应对?
四、CA 证书
为了应对上述黑客伪装成客户端的问题,我们引入了证书。我们使用证书来代替服务端的公钥来验证服务端的真实性。
那么什么是证书呢?它又是如何解决上述问题的呢?
数字证书(Digital Certification)
由证书颁发机构 Certificate Authority(简称 CA)所签发
唯一标识一个站点的身份信息
4.1 证书查看
因为证书用于证实网站的真实性和有效性,任何人都可以查看网站的证书信息,这里我们以 github 的证书为例
4.2 证书申请
首先证书是由专门的证书签发机构 CA 所签发(CA 是全球性的权威组织结构,我们可以完全信任)。
首先申请者需要创建一个证书申请请求,申请请求文件 CSR(Certificate Singing Request)
CSR 文件构成:
网站域名(domain)
IP 地址
公司名称
地理位置
邮箱地址
网站的公钥
将 CSR 准备好后,将 CSR 发送给 CA 机构,CA 会根据其中的信息对站以及公钥进行核实,一旦核实通过,CA 机构会为该站点签发一个证书并返回给申请者。
申请者接收到 CA 证书后部署到 Web 服务中即可。
4.3 证书的工作原理
证书是如何唯一标识网站身份的?客户端在接收到证书后又是如何验证其身份的?
证书指纹:用于唯一标识一个证书(确保证书的完整性)
hash 加密:单项加密算法
不可逆性:无法对一个散列值做逆向操作来获取原始数据
唯一性:不同的数据其计算得出的散列值永远不同,而同一输入计算出的散列值永远一样
数字签名:用于验证证书身份的真实性(确保证书确实由 CA 机构颁发)
利用 PKI 进行加密和解密操作,来验证证书真伪
CA 使用私钥加密,公钥解密
但是这里又有一个问题我们如何确保 CA 的公钥的真实性,如何避免 CA 的公钥不被黑客掉包呢?
答案是:预安装。其实 CA 机构在对证书进行数字签名时不仅会用到私钥,还会用到另一个证书文件:根证书。根证书最主要的作用就是为其他证书签名,而 CA 的公钥也被附加到 CA 的根证书中,每个操作系统都会维护一个根证书库,并默认安装好了全球各地受信任的 CA 根证书,因此要验证证书的真实性时直接从系统根证书中找到 CA 的根证书即可,这样就避免了网络传输时可能会遭遇窃听甚至掉包的风险。
五、总结
至此,我们最终实现了数据传输的安全性。我们经历过以下三个阶段:
阶段一:对称加密阶段
作用:采用会话秘钥对传输的数据进行加密,避免 HTTP 在网络传输中的明文问题
缺陷:用于生成会话秘钥的预主密钥会被窃取
阶段二:非对称加密阶段
作用:使用公钥加密预主密钥,使用私钥解密预主密钥,防止预主密钥被窃取
缺陷:黑客可以伪造服务端蒙骗客户端
阶段三:CA 证书阶段
作用:采用 CA 证书保护公钥,确保公钥的真实性,防止黑客伪造公钥
原理:使用系统根证书确保 CA 证书的完整性防止被黑客伪造
缺陷:如果系统被黑客侵入,黑客可以将自己的根证书嵌入到系统中,然后伪造 CA 证书,同样可以破解网络通信
- 感谢你赐予我前进的力量