之前一直没有怎么仔细看https tls/ssl握手这部分,感觉特别繁琐,但是面试中还挺常被问的。最近认真看了看,感觉很多都写的特别严肃,理解好晦涩,我写一下我自己的理解(比较通俗,不是很严谨。
首先凡事都要先想为什么…
为什么要有https
主要就是因为 http 是明文传输。存在安全风险的问题。
这样做存在的问题:客户端c向服务端s ,如果有个中间人m,m截获得到它的原始数据,再篡改内容,再发给s;这样的话c发给s的内容就能被篡改,不安全。
所以为了提高安全性使用https
https 原理
简单来说就是比http 多了一层 tls/ssl,并且使用混合加密技术。
都说https 是混合加密的,其实就是 即用了非对称加密,又有对称加密;
按我自己的理解,自顶向下我把它拆分为三阶段,0阶段 tcp 三次握手,1阶段 非对称加密生成 会话密钥 (只有通信双方知道),2 阶段 对称加密(使用会话密钥)
- 对称加密:按我的理解,比较白话的来说就是 x 被 a 加密 生成 x* ,然后再使用 a 对 x* 进行解密得到 x; 【x 就是消息,a 就是密钥】
- 非对称加密:按我的理解,【x 为消息, u 为公钥, v为私钥】x 被 u 加密成 x* , 只有 v 可以将 x* 解密成 x,并且,x 若被 v 加密成 x* ,只有 u 可以将 x* 解密成 x。
服务器是 公钥,私钥都有,客户端是只有公钥
0 阶段 tcp三次握手 ,没什么特别的。省略
1阶段 ,非对称加密生成会话密钥, tls/ssl握手部分
首先,服务器端需要向 ca 申请 ssl 证书,比较重要的是 这个证书里 包括了特定的 公钥和私钥。
客户端 有个 公钥,服务器端有 公钥和私钥。
这个阶段,主要是为了生成会话密钥,这个会话密钥关键是靠几个随机数。所以我自己理解的时候,倾向于以随机数的视角看这个过程。其它内容可能会有所省略
- 客户端 c 向 服务器 s 发送一个 client hello, 并发一个 随机数1 给 服务器 s;
- 服务端s 收到后,也给客户端 c 返回一个 随机数2;然后服务器还会发证书给客户端,还会发个公钥给客户端;最后发给客户端告诉它发送完了
- 此时,客户端会再生成一个 随机数3 (aka 预主密钥),这随机数3,会用刚刚收到的 公钥 进行加密,并且将这个加密后的 随机数3’ 发送给服务器s。
- 服务端s 收到加密后的预主密钥,也就是 随机数3’ 后,会用 私钥 进行解密,得到 随机数3
- 然后客户端、服务端用 随机数3 (预主密钥)、随机数1 、随机数2 计算出 会话密钥,双方各自得到的会话密钥是相同的。
后面的会话,都是用这个会话密钥 进行加密、解密,也就是进入2阶段,对称加密阶段。
会话密钥只应用于当前会话,很安全。