💖SSL/TLS专栏目录导航💖
专栏包括的内容: |
---|
💥1. SSL/TLS原理知识 |
💥2. Go源码中TLS实现 |
💥3. openssl中TLS实现 |
💥4. SSL卸载 |
💥5. SSL代理 |
💥6. SSL V.P.N |
💥7. SSL 与 IPSec |
💥8. 其他 |
5.3.1 net/http框架中的入口
tls握手流程在Go的net/http包中的入口是:
- func (c *conn) serve(ctx context.Context) 函数中的tlsConn.Handshake()
关于net/http的框架在上文已经画了一个比较详细的图,其中包括TLS握手流程在HTTP服务源码中的位置。这里直接给出:
Server端每没到一个TCP连接请求后,会创建一个gorouting用于专门处理client端请求。处理client请求的函数是conn.serve()。此函数实现如下:
从这段代码可以看出,server函数实际上就是下图中子协程的工作内容:
下面就是从 tlsConn.Handshake()开始学习TLS握手流程。
在Handshake()函数中,关键操作是:调用当前连接的handshakeFn()
你可能会觉得这里已经找到了tls的握手函数,直接追踪不就行了吗? 理论上是这样的,但实际上handshakeFn是个函数指针,不是一个固定的实现,它的取值与当前连接所属的类型有关(客户端、服务端)。这是面向对象编程的精髓(Go语言也好,C语言也好,都有类似的处理手法)。此处还是得回溯下c当前是哪个对象,然后才能顺腾摸瓜找到真正的TLS握手流程。
当前连接可以是服务端,也可以是客户端;两者在TLS处理上差别很大。而目前主要通过服务端来学习TLS握手流程,当前位于Server端,因此这里应该使用服务端连接:(不要问怎么找到的,问就是花了1分钟全局搜索找的✌️✌️✌️)
至此,便找到真正的TLS握手代码入口。后面便真正开始介绍Server端的TLS握手流程了。