tls.go中的流程梳理

news2024/9/25 1:24:24

文章目录

      • tls.go中的流程梳理
        • b站博主的 tls 加密过程
        • 自己推理的过程(未完待续)
          • 发送ClientHello
          • 获取ServerHello

tls.go中的流程梳理

b站博主的 tls 加密过程
  1. 客户端发送ClentHello(tls版本 +加密套件+ 随机数1)
  2. 服务器发送ServerHello(tls版本 + 加密套件 +随机数2)
    1. 这个阶段之后,双方都知道了tls版本,选定的加密算法,两个随机数
  3. 服务器发送一个X.509证书,客户端用于验证且知道了服务器的公钥,用于后续传输数据加密
  4. 服务器发送它自己的公钥,若上一步有,则这一步不需要
  5. 服务器发送 server Hello Done
  6. 客户端生成 随机数3(预主密钥),并用服务器公钥发送给客户端
    1. 至此 双方都知道了3个随机数,根据3个随机数得到对称加密的秘钥
  7. Change Cipher Spec 表示随后的信息都将用双方商定的加密方法和密钥发送

image.png

自己推理的过程(未完待续)

发送ClientHello
  1. 客户端发送 Dial(network, addr string, config *Config) (*Conn, error)

首先调用了Dialer拨号方法得到了 rawConn,然后通过Client(conn net.Conn, config *Config)封装了tls包下的Conn结构。然后进行握手c.HandshakeContext

// 重要代码  ctx context.Context 
func dial(ctx context.Context, netDialer *net.Dialer, network, addr string, config *Config) (*Conn, error) {
    rawConn, err := netDialer.DialContext(ctx, network, addr)
    
    // 获取主机名 hostname
    colonPos := strings.LastIndex(addr, ":")
    if colonPos == -1 {
        colonPos = len(addr)
    }
    hostname := addr[:colonPos]
    
    // 握手阶段 此处初始化了Client
    conn := Client(rawConn, config)
    if err := conn.HandshakeContext(ctx); err != nil {
        rawConn.Close()
        return nil, err
    }
    return conn, nil
}

  1. 分析 conn := Client(rawConn, config)

发现有一个函数 c.handshakeFn = c.clientHandshake 后续要用到

func Client(conn net.Conn, config *Config) *Conn {
	c := &Conn{
		conn:     conn,
		config:   config,
		isClient: true,
	}
	c.handshakeFn = c.clientHandshake
	return c
}
  1. 点到 conn.HandshakeContext(ctx)分析
// 删掉无关代码
func (c *Conn) handshakeContext(ctx context.Context) (ret error) {
	// 在此处做了 client 的 handshake
	c.handshakeErr = c.handshakeFn(handshakeCtx)
}
  1. 点到 c.handshakeFn(handshakeCtx)
func (c *Conn) clientHandshake(ctx context.Context) (err error) {	
    // 此处初始化了 hello 报文
	hello, ecdheKey, err := c.makeClientHello()
}

// 下面的函数生成了 hello 报文  包括密钥空间 密钥等等
func (c *Conn) makeClientHello() (*clientHelloMsg, *ecdh.PrivateKey, error) {
	hello := &clientHelloMsg{
		vers:                         clientHelloVersion,
		compressionMethods:           []uint8{compressionNone},
		random:                       make([]byte, 32),
		extendedMasterSecret:         true,
		ocspStapling:                 true,
		scts:                         true,
		serverName:                   hostnameInSNI(config.ServerName),
		supportedCurves:              config.curvePreferences(),
		supportedPoints:              []uint8{pointFormatUncompressed},
		secureRenegotiationSupported: true,
		alpnProtocols:                config.NextProtos,
		supportedVersions:            supportedVersions,
	}
	var key *ecdh.PrivateKey
	return hello, key, nil
}
  1. 生成hello报文后,调用函数c.writeHandshakeRecord发送数据,c.readHandshake读取数据
func (c *Conn) clientHandshake(ctx context.Context) (err error) {
	hello, ecdheKey, err := c.makeClientHello()
	
	if _, err := c.writeHandshakeRecord(hello, nil); err != nil {
		return err
	}

	// serverHelloMsg is not included in the transcript
	msg, err := c.readHandshake(nil)

	serverHello, ok := msg.(*serverHelloMsg)

	return nil
}
获取ServerHello

如上:在发送完ClientHello信息后使用c.readHandshake(),获取从服务器过来的ServerHello信息。然后是使用类型强转serverHello, ok := msg.(*serverHelloMsg)

然后根据SeverHello中选择的TLS版本和ClientHello中的版本范围进行校验。看服务器发送过来的TLS版本是否在ClientHello指定的范围中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLM选型指南:如何选择适合自己企业的系统?

导语:在当前的市场竞争中,制造环节的利润逐渐被压缩,企业亟需寻求新的利润增长点来抢占更多市场份额。企业之间的竞争已不再仅仅是产品质量的较量,更是产品创新速度与效率的角逐。由此,研发创新成为企业转型升级的破局…

Swin Transformer和vit

Swin Transformer最为关键的设计在于连续自注意力层间,特征图上的窗划分口实现了半个窗宽的移动。这使得前一层的窗口间可以实现交互和联系,大幅度提升了模型的表达能力。同时在同一窗口内的查询都拥有相同的key序列,使得硬件内存更容易实现大…

【AI冰封挑战】搭档函数计算,“冰”封你的夏日记忆

在 AI 绘画领域,Stable Diffusion、 WebUI、Midjourney 等工具各领风骚,但 ComfyUI 以其独特的自动化工作流机制,自问世以来便迅速崭露头角,成为众多应用开发者和艺术创作者的新宠。它不仅革新了 AI 生图的创作流程,更…

环网自愈型RS485转光纤

一、概述 工业级双环光纤自愈RS485 转 光纤。工业现场总线光通讯中光纤双环网自愈是 一种有效 的高可靠通讯方式 。双环 自愈光 纤 Modem 采用光纤传输技术,专为工业自动化、 SCADA(数据采集及监控)等工业环境的远程数 据通讯而设计,该产品主用实现48…

nvm管理node版本问题处理集合

windows上通过nvm管理node版本,通过nvm安装node,报错了,信息: > Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt. Get > https://nodejs.org/dist/latest/SHASUMS256.txt: dial tcp 104.20.23.46:443: …

手把手教你打包Python项目为whl文件

目录 1,打包whl文件作用 2,单个Python文件打包 1、程序目录 2、程序内容 3、打whl包 4、将whl包导入环境 ​编辑 5、查看效果 6、代码验证 3、多个python文件打包 1、程序目录 ​编辑 2、程序内容 3、打whl包 ​编辑 4、将whl包导入环境 …

C# Unity 面向对象补全计划 泛型

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 1.什么是泛型 泛型(Generics)是C#中的一个强大特性,允许你编写可以适用于多种数据类型的可重用代码,而不需要重复编写…

Canvas实现截图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>canvas实现截图功能</title><style>.ca…

大型赛事5G室内无线网络保障方案

大型活动往往才是国家综合实力的重要体现&#xff0c;其无线网络通信保障工作需融合各类新兴的5G业务应用&#xff0c;是一项技术难度高、方案复杂度高的系统工程。尤其在活动人员复杂、现场突发情况多、网络不稳定等情况下&#xff0c;如何形成一套高效、稳定的应急通信解决方…

Maven的补充(在IDEA中配置,创建Maven项目)

目录 选择版本 已经创建项目中配置 点击最测的设置- CtrlAltS 点击左侧的Maven&#xff0c;我们只需要修改我标记的 未创建项目配置 点击自定义 进入设置界面&#xff0c;选择构建&#xff0c;执行&#xff0c;部署---构建工具----Maven 开始创建项目 我们要改变两个地…

java开发环境搭建基础之3----开发工具eclipse中Maven配置

一.背景 公司安排了带徒弟任务&#xff0c;写点基础的环境搭建这些吧。搭建基础开发环境&#xff0c;主要是jdk、eclipse、git、maven、mysql。后续再考虑编写jenkins、nexus、docker、1panel等CI/CD环境搭建。本次主要内容是eclipse中maven环境的配置。我的开发环境&#xff0…

Linux安装 Redis

Linux 安装 Redis 1、下载、解压 下载方式为两种&#xff1a;官网、网盘 官网&#xff1a; 我这里下载了&#xff1a;7.0.5 网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1A_-ZL3x3Xa5YNlcDqyuV_A?pwdg8jh 提取码&#xff1a;g8jh 解压&#xff1a; 将…

Helm 学习之路,一文弄懂

1. 什么是 Helm 1.1 概述 Helm 是 Kubernetes 应用程序的包管理器,和redhat中yum 管理包类似. 1.2 架构图v3 1.3 下载 官当 最新版本 官方github curl -LO https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz 1.4 安装 解压 #由于是二进制,直接解压到/usr/local/b…

【LabVIEW学习篇 - 12】:通知器

文章目录 通知器案例一案例二案例三&#xff08;在不同VI中用同一个通知器&#xff09; 通知器 同步技术&#xff1a;同步技术用来解决多个并行任务之间的同步或通信问题。 通知器比较适合一对多的操作&#xff0c;类似于广播&#xff0c;一点发出的通知消息&#xff0c; 其它…

【开源】嵌入式Linux(IMX6U)应用层综合项目(2)--智能家居APP

目录 1.简介 1.1功能介绍 1.2技术栈介绍 1.3演示视频 1.4硬件介绍 2.软件设计 2.1智能家居UI设计 2.2.main函数 3.结尾&#xff08;附网盘链接&#xff09; 1.简介 此文章并不是教程&#xff0c;只能当作笔者的学习分享&#xff0c;只会做一些简单的介绍&#xff0c;其…

【电路笔记】-放大器失真

放大器失真 文章目录 放大器失真1、概述2、放大器因幅度失真而产生失真3、削波导致的幅度失真4、谐波引起的频率失真5、相位失真导致的放大器失真放大器失真可以采取许多形式,例如幅度、频率和相位失真,由于剪裁引起。 1、概述 放大器要正确运行且不产生输出信号失真,需要在…

跨境电商做独立站你需要考虑的几个问题

跨境电商卖家无论是做B2B还是B2C的&#xff0c;大部分卖家都是从平台开始做起&#xff0c;后面可能会都接触到独立站&#xff0c;但是说到独立站&#xff0c;相信很大部分的人都不了解&#xff0c;就拿最简单的问题来说&#xff0c;经常有人问&#xff0c;独立站和平台有什么区…

MATLAB(11)智能算法+BP神经网络

一、前言 在MATLAB中实现智能算法与BP神经网络的结合&#xff0c;需要分别编写智能算法的代码和BP神经网络的训练代码&#xff0c;并将两者整合起来。由于篇幅限制&#xff0c;我将提供一个简化的示例&#xff0c;使用遗传算法&#xff08;Genetic Algorithm, GA&#xff09;来…

《学会 SpringMVC 系列 · 返回值处理器》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

微调(二)

Selective类方法中的BitFit 它的核心思想是仅更新模型中的偏置项&#xff08;bias terms&#xff09;或部分偏置项&#xff0c;从而实现参数的稀疏更新。这种方法在小到中等规模的训练数据上表现出色&#xff0c;有时甚至能够超越全模型微调的性能。对于BERT模型&#xff0c;B…