和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生成步骤:
计算MasterSecret
结合pre master secret,Client随机数和Server随机数,调用PRF(pseudo-random function)伪随机函数,截取48位。得到master secret,具体可以参照Master Secret。拿到handshake_messages
所有握手消息,包含Client Finished,不包含ClientHello、ChangeCipherSpec、alerts、其他记录协议消息,记A。- 进行hash算法,得到B。
- 计算Verify Data
B结合master_secret、finished_label(这里是server finished),调用PRF(pseudo-random function)伪随机函数,得到C,最后对C截取固定位数,作为Verify Data。
至此,就得到协商密钥加密的Verify Data了,当Client收到以后,可以用同样的方式验证协商密钥是否正确。至此整个握手流程就结束了。
参考链接
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章