TLS加密流程讲解 | 青训营笔记

247 阅读2分钟

本文讲解个人对于TLS握手流程的理解


Screen Shot 2023-06-04 at 9.41.02 PM.png 上图来自链接:www.bilibili.com/video/BV1KY…


完整流程简介图:

image.png


完整流程详细图: Screen Shot 2023-06-04 at 9.46.04 PM.png

  1. client_hello: 客户端向服务器发送【支持的 TLS 加密版本】,【支持的加密算法集 (加密套件)】和【第一随机数】
  2. server_hello :服务器向客户端发送【服务端确认所支持的 TLS 版本】,【所选择的 加密算法集合(加密套件)】和【第二随机数】【此处会包含一个 nonce 这个 nonce 会 确保本次握手所产生的密钥与其他握手所产生的密钥不同 因此阻断 Reply Attack】

Screen Shot 2023-06-04 at 9.50.39 PM.png

  1. certificate: 服务器再发送一个响应用于【出示服务器自己的证书】 浏览器会根据证书信任列表来确认这个服务器是否可信
  2. server_key_exchange: 服务器把【公钥发送给客户端】
  3. certificate_request [optional] : 如果服务器需要客户端的证书 则在此步骤中发出请求(例如网银证书)
  4. server_hello_done: 服务器告诉客户端东西发完了

Screen Shot 2023-06-04 at 9.48.41 PM.png

  1. certificate: 客户端发送自己的证书给服务端(如果在第3.服务端请求了的话)
  2. client_key_exchange: 客户端生成第三个随机数(预主密钥),并且使用 4. 中服务器的公钥进行加密,并且将加密后的随机数发送给服务器
  3. certificate_verify: 客户端发送对服务端发来的证书的验证

Note: Client 和 server 不会一开始就交换密钥,Client 通常会先验证服务器是否为正确的服务器【In phase2】然后再交换密钥【In phase3】【预防 Man in middle Attack】 会话密钥=第一随机数+第二随机数+预主密钥(非明文,只有服务器和客户端知道)

Screen Shot 2023-06-04 at 10.01.19 PM.png

  1. change_cipher_spec: 客户端告诉服务器往后的数据用协商好的算法和密钥来加密
  2. finished:客户端发送 Encrypted Handshake Message 表示客户端这边的 TLS 协商已经没有问 题了,加密开始
  3. change_cipher_spec: 服务器发送 Encrypted Handshake Message 表示服务器这边也准备好了
  4. finished: 告诉客户端,加密开始