Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TLS握手过程分析 #29

Open
chenpengcong opened this issue Oct 15, 2019 · 0 comments
Open

TLS握手过程分析 #29

chenpengcong opened this issue Oct 15, 2019 · 0 comments

Comments

@chenpengcong
Copy link
Owner

chenpengcong commented Oct 15, 2019

记录对TLS握手过程的一次分析

分析场景: 在git bash下使用curl请求www.baidu.com

$ curl https://www.baidu.com

使用wireshark抓包结果如下(图1)

tls_wireshark1

这里Encrypted Handshake Message在RFC5246中并没有直接提及

通过对HTTPS数据进行解密(参考 Wireshark对HTTPS数据的解密 ),可以看到Encrypted Handshake Message实际上就是握手协议中的Finished

证明过程: 使用浏览器访问https://www.baidu.com, 抓包结果(解密前)如下

tls_wireshark2

wireshark导入Pre-Master-Secret后,可以看到Wireshark将Encrypted Handshake Message识别为Finished

tls_wireshark3

到这里可以将图1抓包结果对应的握手过程表示如下

      Client                                               Server

      ClientHello                  -------->
                                                      ServerHello
                                                      Certificate
                                                ServerKeyExchange
                                   <--------      ServerHelloDone
      ClientKeyExchange
      ChangeCipherSpec
      Finished                     -------->
                                                 ChangeCipherSpec
                                   <--------             Finished

RFC5246详细地描述了上述每条信息包含的数据及作用,在这里我重点梳理密钥协商的一个过程

密钥协商最终目的就是双方协商出一个主密钥(Master secret),该主密钥用来生成衍生出其他密钥,比如会话密钥(参考Differences between the terms “pre-master secret”, “master secret”, “private key”, and “shared secret”?)

RFC5246 section-8.1中描述了Master secret的计算方法

 master_secret = PRF(pre_master_secret, "master secret",
                     ClientHello.random + ServerHello.random)
                     [0..47];

其中ClientHello.random在ClientHello消息中

ClientHello

ServerHello.random在ServerHello中

ServerHello

而pre_master_secret的计算在使用不同协商机制情况下有不同的表现

通过查看Server Hello消息

ServerHello2

得知密钥交换使用了ECDHE协议,原理可以参考ECDH

通过RFC5246 section-8.1.2描述

A conventional Diffie-Hellman computation is performed. The negotiated key (Z) is used as the pre_master_secret, and is converted into the master_secret

可以了解到ECDHE协商得到的值就是premaster secret

因为ECDHE数学原理看不懂所以这里无法展开讨论,但通过阅读该协议的描述可以知道通信双方完成ECDHE交换需要完成以下两点

  1. 约定使用的椭圆曲线
  2. 交换双方使用的公钥

通过分析抓包得到的数据可知,Server通过ServerKeyExchange告知Client使用的椭圆曲线和自己使用的公钥

ServerKeyExchange

然后Client通过ClientKeyExchange告知Server自己使用的公钥

ClientKeyExchange

有了椭圆曲线和对方的公钥后,双方就可以计算出一个相同的值,并将该值作为预主密钥(premaster secret), 到这里密钥协商就算完成,双方的Master secret也都可以计算出来了

暂时分析到这,关于证书校验和其他密钥协商机制的细节有机会再研究下

参考

@chenpengcong chenpengcong changed the title TLS握手过程分析.md TLS握手过程分析 Oct 15, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant