返回

Go中TLS源码学习(6):Server端第三次TLS握手

后端

导语: 本文是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握手的各个阶段对于构建安全的网络应用程序至关重要。