罗剑锋透视HTTP协议学习笔记---26

2023-11-09

26 | 信任始于握手:TLS1.2连接过程解析

TLS的几种子协议及结构
一个TLS报文由若干记录层(Record Layer)组成。记录层相当于是一个消息容器,承载其它协议,它包括一个TVL,描述其承载的其它协议。
在这里插入图片描述
如上图,这是一个Server Hello消息,一条TLS报文,包含了4条TLS handshake Protocol。

在这里插入图片描述

警报协议(Alert Protocol)
握手协议(Handshake Protocol), type=22,wireshark 中过滤条件设置为 tls.record.content_type22或tls.handshake.typex 对应的子handshake包括

name type
Client Hello 1
Server Hello 2
Certificate 11
Server Key Exchange 12
Server Hello Done 14
Client Key Exchange 16
New Session Ticket 4
Finished 20

变更密码规范协议(Change Cipher Spec Protocol),type=20,length=1,切换密文通讯的指示,wireshark过滤条件tls.change_cipher_spec。

TLS false start
即TLS建立连接的过程未结束,客户端即可发送HTTP请求
在这里插入图片描述

如上图,在Client Key Exchange之后和服务端Change Cipher Spec之前,就可以发送数据。

TLS1.2连接建立示意图

在这里插入图片描述

TLS1.2连接建立过程将交换两次消息:
第一组消息:
客户端
Client Hello
+TLS Version #版本号,注Chrome Client Hello填的版本号是TLS1.0
+Random #客户端随机数C
+Cipher suite #列出客户端支持的加密套件

Client Hello的报文结构
TVL
TLV
Random
Session Length
Session ID
Cipher Suit Length
Cipher Suits
Compression Methods Length
Compression Methods
Extensions Length
Extensions: xxx
……
下面是一个真实的TLS1.2的Client Hello
TLSv1.2 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 512
Handshake Protocol: Client Hello
Handshake Type: Client Hello (1)
Length: 508
Version: TLS 1.2 (0x0303)
Random: 1cbf803321fd2623408dfe70d825c9dbdab33fd273f6a884a44e59347bcbd421
Session ID Length: 32
Session ID: f655c8005ba1a4f66cd8790cac2c3847344ff3fad2629d64761f471fac84a35f
Cipher Suites Length: 34
Cipher Suites (17 suites)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 401
Extension: Reserved (GREASE) (len=0)
Extension: server_name (len=19)
Extension: extended_master_secret (len=0)
Extension: renegotiation_info (len=1)
Extension: supported_groups (len=10)
Extension: ec_point_formats (len=2)
Extension: session_ticket (len=0)
Extension: application_layer_protocol_negotiation (len=14)
Extension: status_request (len=5)
Extension: signature_algorithms (len=20)
Extension: signed_certificate_timestamp (len=0)
Extension: key_share (len=43)
Extension: psk_key_exchange_modes (len=2)
Extension: supported_versions (len=11)
Extension: compress_certificate (len=3)
Extension: Reserved (GREASE) (len=1)
Extension: padding (len=202)

服务端
Server Hello
+TLS Version #确认版本号
+Random #服务端随机数S
+Cipher suite #从客户端支持的加密套件中选择一个套件 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,因为本例选择的秘钥交换算法是ECDHE,所以消息中会包括Server Key Exchange
Certificate
Server Key Exchange
包括公钥,曲线,哈希签名算法和签名,#注这个签名是针对Server Key Exchange而不是针对公钥,并且使用的私钥,哈希算法都是本次会话临时生成的,和证书中的公钥没有关系。
Server Hello Done

Server Hello消息虽然叫Server Hello,但其实包括了4个TLS记录,分别是
Server Hello
Certificate
Server Key Exchange
Server Hello Done

Server Hello记录结构
	TVL
		TLV
		Random
		Session Length
		Session ID
		Cipher Suits #服务器选择的加密套件
		Compression Methods
		Extensions Length
		Extensions: xxx

经过第一轮2个TCP报文,客户端,服务端共享了3个信息,C,S, Server Key Params
客户端还拿到了Certificate
下一步客户端需要验证收到的Certificate

第二组消息
客户端
客户端验证了Certificate后发出Client Key Exchange消息,类似的,它是一个TCP报文,包括3个TLS记录
Client Key Exchange
仅包括公钥,#不包括曲线和签名算法可以理解,因为已收到并将使用和服务端相同的曲线和签名算法?
#为什么不包括签名?因为结束会做一个消息整体的加密?
Change Cipher Spec Protocol #客户端切换到加密协议
Finished #把客户端所有发送过的握手协议消息摘要再加密发送给服务器,验证解密功能。【会话秘钥?】

服务端
Change Cipher Spec Protocol #服务端切换为加密协议
Finished #把服务端所有发送过的握手协议消息摘要在加密发送给服务器,验证解密功能。

第二轮消息交换完毕
客户端,服务端各自拿到了Client/Server Params,据此算出pre-master
再根据C,S, pre-master算出master,再根据master扩展出客户端/服务器端会话秘钥
至此ECDHE方式的TLS过程结束。

RSA握手方式

RSA的TLS握手过程类似,主要是pre-master的获得方式不同,RSA中没有Server Key Exchange过程,直接由客户端生成一个随机数作为pre-master,并用服务端的公钥加密,以Client Key Exchange记录的方式发给服务端,服务端私钥解密获得这个随机数。
后继和ECDHE方式一样,也是用C,S,pre-master算出master
在这里插入图片描述

双向验证

抓包招行u盾,抓不到和双向验证的任何记录。。。
理论上,服务端在Server Hello Done要发Certificate Request,客户端端要随后发Client Certificate

课后作业:

密码套件里的那些算法分别在握手过程中起了什么作用?
以TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384为例
ECDHE 对称秘钥交换,并根据交换的公钥算出pre-master
RSA 提供数字证书的公钥和私钥,并用私钥加密证书摘要。
AES_256_GCM 对称加密
SHA384 辅助生成对称秘钥;生成秘钥的PRF使用安全套件中指定的摘要算法;证书明文摘要。

你能完整地描述一下 RSA 的握手过程吗?
Client Hello with C,suits,ver
Server Hello with S, suit,ver
Certificate[Server]
Server Hello Done
Client Key Exchange
RSA public key crypt pre-master
Change Cipher spec[client]
finished
Change Cipher spec[server]
finished

你能画出双向认证的流程图吗?
Client Hello

  • Server Hello
  • Server Certificate
  • Server key exchange
  • Certificate Request
  • Server Hello Done

Client Certificate
Client key exchange
Change Cipher spec
finished

  • Change Cipher spec
  • finished
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

罗剑锋透视HTTP协议学习笔记---26 的相关文章

随机推荐

  • Vmware搭建软路由教程(Openwrt)

    Vmware搭建软路由 准备工作 vmware虚拟机 OpenWrt on VMware master包 https github com luoqeng OpenWrt on VMware提供下载 安装步骤 一 openwrt虚拟机安装
  • Vmware+UOS-server-1050e虚拟机安装(含软件链接)

    1 环境准备 以下使用的系统镜像是 uniontechos server 20 1050e amd64 iso 官网下载地址 统信UOS生态社区 打造操作系统创新生态 Vmware 使用的系统如果是win11 必须安装vmware16 官网
  • jQuery.获取修改value

    获取修改value val 方法 获取和修改有value属性的元素 有value属性的元素有input botton select等 相当于JavaScript中的value
  • FileInputStream的两种读入方式

    package Inputstream import org omg CORBA PUBLIC MEMBER import org testng annotations Test import java io FileInputStream
  • 使用libgmp时出现: 【C4146 一元负运算符应用于无符号类型,结果仍为无符号类型】的解决方案

    vs2019下 使用libgmp时出现 C4146 一元负运算符应用于无符号类型 结果仍为无符号类型 的错误 使用网上说的 关闭SDL检查 的方法无效 用下面的方法解决了这个问题 在 include
  • Pineapple Incident【Codeforces 697 A】

    Codeforces Round 362 Div 2 A 简单题 include
  • TPO39

    Some people hold the viewpoint that it was easier to distinguish a secure and successful job in the past instead of in t
  • 数据结构链表题集

    题目一 113 删除排序链表中的重复数字 二 LintCode 思路 创建哨兵位头结点 原地删除 class Solution public param head head is the head of the linked list re
  • C#练习——窗体实现简单计算器,完成加,减,乘,除,取余,简单运算

    c windows窗体练习 实现简单计算器 完成加 减 乘 除 取余 简单运算 编写环境 vs2017 using System using System Collections Generic using System Component
  • 普通人自学Python后的用处

    普通人自学Python后的用处 python是一个非常优秀的编程语言 逐渐受到越来越多人的青睐 而且学会了python能做很多事情 在上班的同时还能利用python做一些兼职 例如 兼职处理数据 兼职查询资料 兼职P图等 那么普通人自学Py
  • 单片机调试出现一些不常见问题及原因

    1 4位共阳数码管的有一个位的其中一段不亮 而其他位的该段能正常显示 这有些不符合常理 因为共阳数码管的4个为的段是连在一起的 如果是程序问题或者硬件连接有问题 应该4位全不亮 原因 经排查 原因是发现电路板的背面该段和其他位的位选线短路了
  • 生成项目目录结构(based on windows system)

    描述 作为程序员 在工作中 我们经常会有需求 需要罗列出项目的结构图 如果手工来整理的话 太过浪费时间 其实我们可以借助tree命令来快速生成目录结构 本文主要介绍一下 基于windows系统 如何快速生成目录结构的方法 步骤 1 开始 g
  • vue项目中点击非刷新按钮,页面刷新并且路由多了个问号解决方案

    问题描述 在vue项目开发过程中 点击查询或重置按钮 结果页面刷新了一遍 发现路径变成了 localhost 8080 advanced 原因 这是因为在 form 表单里 点击了button 按钮 触发了表单的默认事件 也就是触发了提交行
  • 自动化部署MySQL 5.6 步骤 制作到ftp共享,永远使用

    首先需要搭建ftpserver yum install vsftpd service vsftpd start 这样ftp服务就起来了 这里只是简单的使用 所以没有使用配置文件 这样我们只要将需要的文件置于 var ftp pub 文件夹下
  • http包通信方式,通信过程,包解析过程

    HTTP Hypertext Transfer Protocol 是一种客户端 服务器协议 用于在Web上传输数据 HTTP协议定义了客户端和服务器之间的通信方式 通信过程以及数据包解析过程 本文将详细讲解HTTP包通信方式 通信过程和包解
  • Dubbo调用过程监控

    MonitorFilter 主要对调用过程进行监控 public Result invoke Invoker
  • 【代码规范】函数命名总结

    Service DAO 层方法命名规约 Get 完整的拿出某一固定存在的结构 不修改 Build 需要根据一些因素构建一个结构 List 获取批量 Fetch 不用传参数获取 Handle handleFilePathFail这种 用于处理
  • java的windows脱机,Win32 API LogonUser对本地帐户的脱机访问

    是否有一系列标志允许 LogonUser 在计算机未连接到网络时返回可用于冒充本地用户的令牌 但所有帐户已在本地存在 我有域帐户执行应用程序 MYDOMAIN FooUser 而我正试图获得一个假冒令牌 MYLAPTOP TestUser
  • Kubernetes快速入门

    前言 本文旨在为Kubernetes入门使用者 提供使用Kubernetes需要掌握的基本知识 1 基础概念 1 1 集群与节点 kubernetes是一个开源的容器引擎管理平台 实现容器化应用的自动化部署 任务调度 弹性伸缩 负载均衡等功
  • 罗剑锋透视HTTP协议学习笔记---26

    26 信任始于握手 TLS1 2连接过程解析 TLS的几种子协议及结构 一个TLS报文由若干记录层 Record Layer 组成 记录层相当于是一个消息容器 承载其它协议 它包括一个TVL 描述其承载的其它协议 如上图 这是一个Serve