最后一次,彻底搞懂 HTTPS 的原理
如果你对 HTTPS 还是一知半解,那么,这篇文章我将用大白话来解释一下它的原理,也尽量不涉及概念性的东西。
太多概念性不好理解而且还很容易忘记,用自己的语言理解可能会更深刻一些。
加密
我们都知道,HTTPS 相对 HTTP 更加安全,它是在传统 HTTP 基础之上,对传输的数据进行了一层加密。
1️⃣ 要如何对数据进行加密呢?
其实也很简单,只需要客户端与服务端之间达成一个“秘密约定”,用这个约定对数据进行加密处理,在对方收到密文后,再使用相同的约定进行解密。
这就是通常所说的对称加密,而这个约定,就是密钥。
所以,👉 HTTPS 对“传输数据”使用的是对称加密。
现在,问题来了:如何才能确保客户端与服务端拿到相同的密钥呢?
HTTPS 加密的核心就在这里,不管是客户端告诉服务端密钥,还是服务端告诉客户端密钥,都必然需要产生一次数据传输,2️⃣ 如何才能保证“交换密钥”的动作本身是安全的呢?
聪明的你,可能就立马想到了:“非对称加密”不就是专门干这个的吗?
公钥对数据进行加密,公开的钥匙谁都可以拿到,但加密的数据只有通过私钥才能解开。
也就是说:👉 只要客户端使用公钥对“密钥”进行加密,然后服务端再使用私钥进行解密,就能够安全的交换这个“密钥”了。
那么,交换密钥的逻辑大概就是这样的:
客户端告诉服务端:我想要连你了 服务端返回公钥:你用这个加密密钥 客户端将加密后的密钥发给服务器,服务器解密拿到密钥
❗️ 注意
为了更好理解,交换密钥的过程简化了,实际上还传递了加密套件、随机数等信息。
交换的这个密钥也只是一个“预主密钥”,并不是最终的密钥,最终的密钥是双方根据“预主密钥”和随机数通过算法计算出来的。
简单总结一下,加密过程涉及到两个东西:
交换密钥:非对称加密 数据加密:对称加密
服务器端只需要保存好“私钥”,就不怕中间人窃取了,因为所有的数据都是加密的,拿到了也没用。
证书
目前,其实还存在一个巨大的问题:1️⃣ 如何确定与你交换密钥的服务器本身是可信的呢?
如果建立连接的服务器本身就是不安全的,比如客户端本身是要请求 A 服务器,但被篡改成了 B 服务器,那后面这一系列的加密都毫无意义。
这就是 HTTPS 的另一大核心:👉 证书。
证书必须由第三方权威机构进行颁发,然后与服务器域名绑定。在客户端建立连接时,服务器必须给客户端发送这个证书,来证明服务器是安全的。
浏览器拿到证书后,2️⃣ 又如何确定这个证书是可信的呢?
向权威机构进行验证?但这个“验证”的动作又会涉及到网络传输,又如何保证“这次传输”的安全呢?因此,线上验证这条路肯定是走不通的。
这里就不得不引出一个👉 证书链的概念了。
所谓证书链:从下到上就是服务器证书 → 中间证书 → 根证书的一个信任链条。
客户端可以通过上一级证书来验证下一级证书的合法性,比如:中间证书可以验证服务器证书的合法性,根证书可以验证中间证书的合法性。
而根证书是操作系统和浏览器内置的!
整个验证过程不需要网络,只要逐步验证通过,则说明服务器证书就是合法的。
3️⃣ 证书链是如何验证的呢?
实现原理:通过👉 数字签名验证证书的合法性。
服务器会返回完整的证书链给客户端,每一级证书,都由上一级证书的“私钥”进行签名(颁发时),并且还包含一个“公钥”信息。
客户端验证签名过程大概是这样的:
从服务器证书提取“签名信息”,并从上一级(中间证书)获取“公钥”; 对服务器证书计算哈希值 H1(签名信息); 使用“公钥”解密签名得到 H2,若 H1 = H2,则证书有效; 重复上述步骤,再次对中间证书进行验证,直到根证书。
由于根证书是内置且绝对合法的,因此这一过程只要全部验证通过,则证明服务器证书就是真实合法的。
当然,证书合法后,还会验证一些基础属性,如:域名信息、有效期等。只要有一项不对,客户端就会立马终止连接。
🌈 补充
非对称加密两个核心使用场景:
数据加密:公钥加密,私钥解密 数字签名:私钥签名,公钥验证;防篡改
简单总结:
证书就像服务器的身份证,向客户端证明我就是你要找的合法服务器。
加密优化
以上的加密方法,看似挺完美,但还是存在问题。
若服务器的“私钥”不小心泄露了,那么“历史会话”的密钥就能够被计算出来,也就是不支持前向保密。
为什么私钥泄露后历史密钥能被破解?
因为之前的“密钥”都是通过“预主密钥”与随机数计算出来的,只要拿到服务器私钥,就能够解密“预主密钥”,自然也就能够用相同的方法计算出会话的密钥了。
所以,TLS 1.3 就出现了。
它不需要传输“预主密钥”,而是双方根据对方的公钥与自己的私钥,来计算出相同的“密钥”。
其流程如下:
客户端生成临时公钥与私钥对,发送“临时公钥”给服务器; 服务端使用相同的算法生成临时的公钥与私钥对,返回“临时公钥”给客户端; 双方计算“共享密钥”:共享密钥 = 私钥 x 对方的公钥; 使用共享密钥计算出最终的“会话密钥”。
核心原理依赖于一种椭圆曲线的算法,它保证了双方能够计算出相同的“共享密钥”。
同时,可以注意到:服务器的“长期公钥与私钥”不再参与加密的过程,只用于签名验证,与加密完美解耦。
并且握手流程,也从之前的 3 次变成了 2 次。
由于密钥是通过“临时”公钥+私钥生成的,所以,不管如何泄露,历史会话都是安全的;因为临时公钥+私钥在会话结束后就已经销毁了。
要想破解会话密钥,就必须拿到会话的临时私钥,而这,几乎不可能。
总结
HTTPS = HTTP + TLS,TLS 1.3 是目前的主流,它的两大核心功能:证书+加密。
1️⃣ 证书
证书链:服务器证书 → 中间证书 → 根证书,确保服务器真实可信; 数字签名:使用上级公钥对数字签名进行验证。
2️⃣ 加密
密钥交换:基于椭圆曲线交换临时公钥,并且计算出相同的共享密钥,进而得到最终的会话密钥; 数据加密:使用“会话密钥”对数据进行加解密传输。
加密,避免了数据裸奔;而证书,确保了是对的人。


