HTTPS加密算法
利用TLS; RSA算法
- 首先建立TCP三次握手
- 之后进行TLS四次握手(非对称加密)
涉及到三个随机数client random
、server random
、pre_master_key
- 第一次握手
客户端告诉服务端支持什么样的加密协议版本(TLS 1.2)
,使用什么样的加密套件(RSA)
,并发送一个client random
;- 第二次握手
服务端告诉客户端确定的加密方式等信息
(比如:TLS 1.2,RSA),服务器证书
以及服务器随机数server random
;- 第三次握手
客户端从服务器证书中取出服务器公钥
,再生成第三个随机数pre_master_key
;将该随机数用公钥加密;用三个随机数得到一个会话密钥,同时把迄今为止的通信数据内容生成一个摘要(也叫finished报文),用会话密钥加密一下,发给服务器做校验;- 第四次握手
服务端使用服务器私钥解密得到客户端的pre_master_key
;服务端用三个随机数,同样的算法获得一个会话密钥
,同样将迄今为止的通信数据内容生成一个摘要(也就是finished报文),发给客户端做校验;
- 加密通信(对称加密)
之后利用会话密钥来进行对称加密; - 为啥不用非对称加密?
非对称加密慢;对称加密相对快一点;
服务器证书
服务器证书本质上是CA(权威数字证书机构)的私钥加密过的服务器公钥;
被私钥机密过的内容可以被公钥解密;公钥任何人都可以得到,所以客户端可以用CA公钥来解密服务器证书,从而拿到藏在里面的服务器公钥;
为什么不能直接传服务器公钥呢?因为服务器公钥传输过程中会被黑客替换掉,客户端拿着假公钥来加密pre_master_key;黑客可以获取pre_master_key;而client random、server random是公开的,因此可以计算出会话密钥;有了会话密钥就可以破坏通信内容了;
第三次握手:CA加解密可以让client确认server身份;
如何获得CA公钥;
可以请求CA官网,获取公钥;但是上网人数过多,不太合适,可以直接将CA公钥放到操作系统或者浏览器中
TCP三次握手(Three-Way Handshake)
三次握手是TCP建立连接的过程,目的是为了同步连接双方的序列号、确认对方的接收能力以及建立可靠的通信连接。握手过程如下:
- 第一次握手
客户端发送一个带有SYN
标志的TCP
报文到服务器,并且随机初始化一个序列号 Seq=x。这个包表示客户端想要建立连接。 - 第二次握手
服务器接收到客户端的SYN报文
后,会以自己的SYN报文
作为应答,同时也会给客户端的SYN报文进行确认(ACK
)。服务器选择自己的序列号 Seq=y,确认号 Ack=x+1(表示收到了客户端的序号x),然后将这个SYN+ACK包发送给客户端。 - 第三次握手
客户端收到服务器的SYN+ACK
包后,会再向服务器发送一个确认包ACK
,确认号 Ack=y+1,表示收到了服务器的序号y。这个ACK报文发送完毕后,客户端和服务器就建立了连接,可以开始数据传输。
TCP四次挥手(Four-Way Handshake)
四次挥手是TCP断开连接的过程,确保了 两个方向上的数据传输 都被正确关闭,且双方都知道连接已经结束。挥手过程如下:
- 第一次挥手
客户端发送一个FIN(Finish)标志的TCP报文到服务器,表示自己已经没有数据要发送了,但是仍然可以接受来自服务器的数据。序列号 Seq=u(u是客户端当前的序列号)。 - 第二次挥手
服务器接收到客户端的FIN报文 后,会发送一个ACK确认报文给客户端,确认号 Ack=u+1,表示已经接收到客户端的断开请求。此时,服务器可能还有数据需要发送给客户端,所以不会立即关闭连接。 - 第三次挥手
当服务器确定自己也没有数据需要发送给客户端时,会发送一个FIN报文
给客户端,序列号 Seq=v(v是服务器当前的序列号),表示服务器也没有数据要发送了。
第四次挥手
客户端收到服务器的FIN报文后,发送ACK
确认报文给服务器,确认号 Ack=v+1,表示已经接收到服务器的断开请求。
这个ACK报文发送完毕后,客户端进入TIME_WAIT状态等待足够的时间确保服务器收到了最后的ACK报文,之后关闭连接。服务器收到ACK后,关闭连接。
通过这样的机制,TCP保证了连接的可靠建立和优雅关闭。