返回
Go中TLS源码学习(6):Server端第三次TLS握手
后端
2023-12-04 05:57:10
导语: 本文是Go语言中TLS源码学习系列文章的第六篇,我们将深入探讨Server端的第三次TLS握手过程,揭秘其内部运作机制和关键细节。
引言
TLS握手协议是建立安全通信通道的关键步骤。在上一篇文章中,我们探讨了Server端的第二次TLS握手。在此基础上,本文将深入解析第三次TLS握手,揭示其完成连接协商的奥秘。
Server端第三次TLS握手流程
1. 收到客户端ChangeCipherSpec消息
在Server端收到客户端的ChangeCipherSpec消息后,表明客户端已完成自身加密密钥的计算,并准备使用这些密钥进行加密通信。
2. 发送ChangeCipherSpec消息
Server端收到客户端的ChangeCipherSpec消息后,也发送ChangeCipherSpec消息给客户端,表明其也准备使用新的加密密钥。
3. 发送Finished消息
在发送ChangeCipherSpec消息之后,Server端计算Finished消息,该消息包含了连接协商期间交换的所有消息的哈希值。
4. 验证客户端的Finished消息
Server端收到客户端的Finished消息后,验证其是否与自己计算的Finished消息匹配。如果匹配,表明客户端已正确完成了连接协商。
5. 发送握手完成消息
如果验证通过,Server端发送握手完成消息给客户端,表明它已完成握手过程。
6. 握手完成
客户端收到Server端的握手完成消息后,双方确认握手过程已完成,可以开始进行加密通信。
代码解析
func (c *Conn) serverHandshake() error {
...
// 收到客户端ChangeCipherSpec消息
if err := c.readChangeCipherSpec(); err != nil {
return err
}
// 发送ChangeCipherSpec消息
if err := c.writeChangeCipherSpec(); err != nil {
return err
}
// 发送Finished消息
if err := c.writeFinished(masterSecret, finishedHashClient); err != nil {
return err
}
// 验证客户端的Finished消息
if err := c.checkFinished(masterSecret, finishedHashClient); err != nil {
return err
}
// 发送握手完成消息
if err := c.writeHandshakeComplete(); err != nil {
return err
}
...
}
总结
Server端的第三次TLS握手过程完成了连接协商的最后阶段。通过计算和验证Finished消息,双方确认了握手过程的完整性和安全性,并建立了安全的通信通道。深入理解TLS握手的各个阶段对于构建安全的网络应用程序至关重要。