老青菜

TLS1.2 Server Finished

2019-06-10

Client Finised类似,Server Finised是Server第一条使用协商算法、密钥保护的消息。用来验证协商的密钥。当Server发送完Change Cipher Spec后,立即对handshake_messages握手消息进行加密,得到密文Verify Data,然后发送Finished消息。

消息格式

不难发现,消息格式和Client Finised的消息格式一致。

Verify Data

校验数据,也就是加密的数据。

加密过程

这个Verify Data计算规则和Client Finised的Verify Data大致相同,但是有些参数不一样,我们先来看下rfc是怎么定义的。

struct {
      opaque verify_data[verify_data_length];
  } Finished;

verify_data
     PRF(master_secret, finished_label, Hash(handshake_messages))
        [0..verify_data_length-1];

finished_label
     For Finished messages sent by the client, the string
     "client finished".  For Finished messages sent by the server,
     the string "server finished".

这里我画了一张图,总结了一下Verify Data生成步骤:

  1. 计算MasterSecret
    结合pre master secret,Client随机数和Server随机数,调用PRF(pseudo-random function)伪随机函数,截取48位。得到master secret,具体可以参照Master Secret

  2. 拿到handshake_messages
    所有握手消息,包含Client Finished,不包含ClientHello、ChangeCipherSpec、alerts、其他记录协议消息,记A。

  3. 进行hash算法,得到B。
  4. 计算Verify Data
    B结合master_secret、finished_label(这里是server finished),调用PRF(pseudo-random function)伪随机函数,得到C,最后对C截取固定位数,作为Verify Data。

至此,就得到协商密钥加密的Verify Data了,当Client收到以后,可以用同样的方式验证协商密钥是否正确。至此整个握手流程就结束了。

参考链接

TLS1.2
TLS1.3
HandShake Protocol

Tags: HTTP
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章