tls 代码阅读
概览
分别从客户端和服务端角度,解决整个握手流程,基于go 1.16版本进行分析
重点:三个随机数:client hello随机数、server hello随机数、keyExchange 随机数
三个随机数生成后续使用对称算法减的密钥
客户端和服务端都是基于Conn进行操作的
客户端处理流程
概览
使用单独goroutine迁移处理tls
代码实现,handshake_client.go
入口:clientHandshake
- makeClientHello:
- 支持版本
- 支持的cipher suite
- 随机数
- 支持的算法
- loadSession:如果开启了session,客户端和服务端均开启
- 发送helloMsg,writeRecord(hello.marshal())
- 获取serverMsg
- 读取serverHelloMsg
- 处理serverHelloMsg
- 确认cipher suite
- server确认是否开启session
如果开启,session没有过期- establishKeys
- readSessionTicket
- readFinished
- sendFinished
- 如果session不存在,doFullHandshake,做全量握手
- 读取certificat