本文讲解个人对于TLS握手流程的理解
上图来自链接:www.bilibili.com/video/BV1KY…
完整流程简介图:
完整流程详细图:
- client_hello: 客户端向服务器发送【支持的 TLS 加密版本】,【支持的加密算法集 (加密套件)】和【第一随机数】
- server_hello :服务器向客户端发送【服务端确认所支持的 TLS 版本】,【所选择的 加密算法集合(加密套件)】和【第二随机数】【此处会包含一个 nonce 这个 nonce 会 确保本次握手所产生的密钥与其他握手所产生的密钥不同 因此阻断 Reply Attack】
- certificate: 服务器再发送一个响应用于【出示服务器自己的证书】 浏览器会根据证书信任列表来确认这个服务器是否可信
- server_key_exchange: 服务器把【公钥发送给客户端】
- certificate_request [optional] : 如果服务器需要客户端的证书 则在此步骤中发出请求(例如网银证书)
- server_hello_done: 服务器告诉客户端东西发完了
- certificate: 客户端发送自己的证书给服务端(如果在第3.服务端请求了的话)
- client_key_exchange: 客户端生成第三个随机数(预主密钥),并且使用 4. 中服务器的公钥进行加密,并且将加密后的随机数发送给服务器
- certificate_verify: 客户端发送对服务端发来的证书的验证
Note: Client 和 server 不会一开始就交换密钥,Client 通常会先验证服务器是否为正确的服务器【In phase2】然后再交换密钥【In phase3】【预防 Man in middle Attack】 会话密钥=第一随机数+第二随机数+预主密钥(非明文,只有服务器和客户端知道)
- change_cipher_spec: 客户端告诉服务器往后的数据用协商好的算法和密钥来加密
- finished:客户端发送 Encrypted Handshake Message 表示客户端这边的 TLS 协商已经没有问 题了,加密开始
- change_cipher_spec: 服务器发送 Encrypted Handshake Message 表示服务器这边也准备好了
- finished: 告诉客户端,加密开始