前情提要
这一篇是深入理解HTTPS系列的终结篇了,下面会详细剖析HTTPS通信的全过程
以www.baidu.com网站为例,利用tcpdump和wireshark抓包来看一次HTTPS握手的全过程,以下是wireshark的抓包记录:
大致可以分为四个部分:
- 经典TCP三次握手:想必都很熟悉的老朋友SYNC、ACK
- TLS握手:下面会重点展开介绍。可以看到TLS握手中还是有很多的TCP ACK信息,TLSv1.2表示的是会话使用的TLS 1.2版本,这些信息本身底层都是TCP包
- TLS加密通信:图中显示的是明文 主要是在抓包过程中记录了会话主密钥 所以显示的是解密后的结果
- TCP/TLS挥手:和TCP经典四次挥手差不多
TLS握手
在上图中的TLS握手过程中,主要有以下几个INFO信息,这些其实也就是TLS协议中的内容。理解了这些协议过程,实际也就掌握了HTTPS通信握手过程
- Client Hello:客户端向服务端传递TLS协议版本、支持的密码套件列表以及随机数
其中,密码套件具体如下:
以TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
为例,介绍下密码套件含义:
-
- ECDHE:密钥协商算法,不清楚的同学可以查看系列之前的文章
- RSA:身份验证算法,一般验证服务端证书时采用的算法,即服务端证书的签名算法
- AES_128_GCM:密钥长度为128比特且迭代模式为GCM的对称加密算法
- SHA256:HMAC算法
- Server Hello:服务端协商密码套件
可以看到服务端协商出来的密码套件是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
- Certificate:服务端传输自身的证书链给客户端,客户端需要进行验证
这里百度服务端传的是一条完整的证书链
- Server Key Exchange:该消息的作用主要是服务端向客户端传递动态参数,比如动态DH参数、ECC椭圆曲线参数等
本例中如上面的椭圆曲线选择。因为是明文传输的,为了防止消息被篡改,会包含一个签名信息
- Server Hello Done:这是一条空消息,目前是告知客户端“我已经发送了足够的消息了“,接下来你可以验证证书以及协商预备主密钥了
- Client Key Exchange:在接收到服务器的Server Hello Done消息后,客户端应该立刻发送该消息,该消息的主要作用就是协商出预备主密钥。
这里可以看到客户端发送的就是客户端生成的DH密钥对中,服务端这里就可以根据公钥计算出预备主密钥。
- Change Cipher Spec:通知对方后续的消息都需要进行TLS加密
- Finished:在握手协议中,所有的子消息没有加密和完整性保护,消息很容易被篡改,为了避免消息篡改,客户端和服务器端需要校验对方发送的Finished子消息,确保所有的握手消息没有被篡改
随后服务端也会依次发送Change Cipher Spec和Finished消息。一旦验证通过,握手环节就结束了,双方都可以根据握手过程中的信息计算中预备主密钥,从而计算出会话密钥了。
这里我们再将整个过程梳理一下:
抓包过程
感兴趣的同学可以自行利用tcpdump和Wireshark进行抓包分析,这里介绍下作者的抓包过程:
- 环境准备:在MAC电脑上安装tcpdump和wireshark
- 抓包准备:注意不要有其他的软件同时访问这个网址 否则数据量比较大 不好分析
sudo tcpdump -i any 'host www.baidu.com' -w 'baidu.https.pcap'
- 执行请求
# SSLKEYLOGFILE是期望保存密钥的文件路径 在Wireshark解密时需要
SSLKEYLOGFILE=./log curl 'https://www.baidu.com' -I
- 导入wiresahrk展示
点击File -> Open,打开刚刚的baidu.https.pcap抓包文件即可看到抓包数据了,如果想要解密数据,可以在Preference -> TLS中导入SSLKEYLOGFILE文件
总结
以上就是关于HTTPS的全部内容,这一篇也是系列的终篇,希望对大家有所帮助,同时也期待下一个全新系列的开启~