老青菜

TLS1.2 HandShake Protocol

2019-06-09

上一篇文章中,我们大致的了解了SSL/TLS的分层结构,HandShake Protocol(握手协议)作为最关键的协议,它运行在Record Layer之上,主要作用就是验证会话,协商出会话的安全密钥(对称密钥),而这个对称密钥是用来加解密后续会话的所有消息。

前言

下面我们来我们通过一次抓包来分析下握手流程,由于ECDHE(短暂的椭圆曲线密钥协商算法)算法的限制,Wireshark本身的RSA Key功能不能解析HTTPS的包,所以我们使用Wireshark+Chrome,并做以下配置:

配置Chrome

Chrome支持导出会话中的安全密钥到指定文件里,执行下面的命令,把ssh key保存到当前用户目录下的sslkeylog.log文件里,并且打开一个新的Chrome窗口。我们在这个窗口里请求HTTPS链接,会话密钥都会记录在文件里。

sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --ssl-key-log-file=/Users/`whoami`/sslkeylog.log

配置Wireshark

Wireshark支持加载安全密钥文件,解密HTTPS包。操作步骤如下:

#Wireshark v3.1.0
1.Wireshark - Preferences - Protocols - TLS。
2.找到 (Pre)-Master-Secret log filename项,选择刚才设置的 sslkeylog.log 。

开始抓包

找到刚才打开的Chrome窗口,或者重复执行步骤1,然后在新打开的Chrome窗口里输入HTTPS链接。

https://www.laoqingcai.com/api/user

不出意外,Wireshark里就可以看到各种包了。如果觉得wireshark显示包太多了,可以增加过滤条件,比如:ip.src == xx or ip.dst == xx 等等。

如上图,首先TCP三次握手,接着进行TLS 握手,然后才开始传输应用层(HTTP)的消息。接下来我们来看一下握手流程。

HandShake Flow

参照TLS1.2 rfc5246文档和Wireshark抓的包,我简单的画了一个图,如下:

这里简单解释一下流程:

  1. Client发送Client Hello
    问候消息,附带随机数,支持的加密套件等等。
  2. Server发送Server Hello
    问候消息,附带随机数,选择的加密套件等等。
  3. Server发送Server Certificate
    Server证书链信息。
  4. Server发送Server Key Exchange
    dh_anon 、dhe_dss、dhe_rsa加密算法下,交换Server dh PubKey(dh_Ys)协商参数,用来协商出DH密钥,作为PreMasterSecret。
  5. Server发送Certificate Request
    双向认证的场景,Server需要校验客户端证书,发送此消息,获取Client证书。
  6. Client发送Client Certificate
    双向认证的场景,Client校验Server证书链信息完成后,发送此消息。
  7. Client发送Client Key Exchange
    交换Client DH算法协商参数,或者直接交换RSA算法的PreMasterSecret。
  8. Client发送Certificate Verify
    以便Server校验是否是Client证书持有者(双向认证)。
  9. Client发送Change Cipher Spec
    Client生成MasterKey,然后通知Server开始使用加密策略,RSA和DiffHellman生成MasterKey的方法不一样,具体下面有详细介绍。
  10. Client发送Finished
    Client对握手消息使用Hash,结合MasterKey使用PRF(为随机函数),截取固定位数,发送给Server,以验证交换密钥。
  11. Server发送Change Cipher Spec
    Server生成MasterKey,然后通知Client开始使用加密策略。和Client一样,RSA和DiffHellman生成MasterKey的方法不一样。
  12. Server发送Finished
    Server对握手消息使用Hash,结合MasterKey使用PRF(伪随机函数),截取固定位数,发送给Client,以验证交换密钥。

上面是简单介绍每个环节,对应链接里有详细的描述。

参考链接

TLS1.2
TLS1.3
HandShake Protocol

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

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

扫描二维码,分享此文章