tls.go中的流程梳理

server/2024/12/21 22:58:49/

文章目录

      • 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)// 获取主机名 hostnamecolonPos := strings.LastIndex(addr, ":")if colonPos == -1 {colonPos = len(addr)}hostname := addr[:colonPos]// 握手阶段 此处初始化了Clientconn := 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.clientHandshakereturn c
}
  1. 点到 conn.HandshakeContext(ctx)分析
// 删掉无关代码
func (c *Conn) handshakeContext(ctx context.Context) (ret error) {// 在此处做了 client 的 handshakec.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.PrivateKeyreturn 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 transcriptmsg, 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.ppmy.cn/server/96506.html

相关文章

OpenHarmony网络请求库-httpclient

简介 HTTP是现代应用程序通过网络交换数据和媒体的的主要方式。httpclient是OpenHarmony 里一个高效执行的HTTP客户端,使用它可使您的内容加载更快,并节省您的流量。httpclient以人们耳熟能详的OKHTTP为基础,整合android-async-http&#xf…

OpenGL ES->工作机制

渲染流程 渲染目的:输入3D立体坐标,输出绘制后的2D平面像素工作流程:顶点着色器->图元装配->几何着色器->光栅化->片段着色器->测试与混合,整个工作流程被封装在GPU内部,无法改变。运行在CPU的代码调用…

众人帮蚂蚁帮任务平台修复版源码,含搭建教程。

全修复运营版本的任务平台,支持垂直领域细分,定向导流,带有排行榜功能,任务发布上传审核,用户信用等级,充值接口等等均完美可用。支付对接Z支付免签接口,环境配置及安装教程都已经打包。 搭建环…

Debian | Vscode 安装与配置 C 环境

Debian | Vscode 安装与配置 C 环境 安装 vscode sudo apt update sudo apt install software-properties-common apt-transport-https curlcurl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -sudo add-apt-repository "deb [archamd64…

2023大数据-架构师案例(八)

Lambda架构 nginx (b) Hbase (c)Spark Streaming (d)Spark (e)MapReduce (f)ETL (g)MemSQL (h)HDFS &#x…

[最短路Floyd],启动!!!

B3647 【模板】Floyd #include<bits/stdc.h> #define ll long long #define fi first #define se second #define pb push_back #define PII pair<int,int > #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N …

【实时建图】MapTR(1)------ 论文详解

作者们提出了一种有效构建高清地图的方法(MapTR),该地图为自动驾驶系统的规划提供丰富且精确的环境信息。这是一种结构化端到端变换器,用于高效在线矢量化地图构建。作者提出了一种统一的置换等价建模方法,即将地图元素建模为一个具有一组等价置换的点集,这准确地描述了地…

数据结构----------贪心算法

什么是贪心算法&#xff1f; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在问题求解过程中&#xff0c;每一步都采取当前状态下最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…