https握手详解

0x00 什么是https协议

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。

0x01 HTTPS和HTTP的区别

HTTPS和HTTP的区别主要为以下四点:

  • https协议需要到ca申请证书,一般免费证书很少,需要交费。
  • http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

0x02 SSL协议

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
所以SSL所具备的功能是:保证传输数据的保密性、完整性,并且实现通信双方的身份认证。
在协议栈种位置如下:

SSL协议是一个分层协议,共有两层组成。

高层协议包括:

  • SSL握手协议
  • 改变加密约定协议
  • 报警协议

底层协议是SSL记录层协议,是一个简单的封装协议,用来记录协议的功能,保证协议的完整性,机密性。

0x03 SSL握手

这里主要分析一下高层协议中的握手协议。
SSL握手协议主要负责:

  • 算法协商
  • 身份验证
  • 确定密钥

为了很直观的看到它具体做了什么,采用wireshark抓包的方式来分析一次Full Handshake,即全流程握手。

0x04 wireshark抓包分析

接下来我们抓包进行分析:

1.我们打开wireshark软件,监视正在使用的网卡,然后通过浏览器访问 www.github.com 抓取完成后我们停止捕获。

2.在过滤器输入ssl,过滤ssl协议,找到本机向 github.com 的ip地址发起的client hello。

3.右键追踪,选择ssl流。

4.首先是client hello,这个包携带着客户的SSL版本号,加密套件列表,压缩算法列表,客户端随机数,sessionid = 0,传送给服务器。
我们开始分析,首先展开client hello的SSL,找到Handshark。可以看到client hello里面包含的各项数据。

分别是:

  • SSL版本号:TLS 1.2
  • 压缩算法NULL
  • sessionid = 0
  • 密码套件如下

  • server name,可以看到是 github.com。

5.然后找到server hello,这个包是服务器选择版本,确定要用的加密套件,压缩算法,计算sessionid以及随机数,发送给客户端。

同样展开SSL:

我们可以看到各项对应数据被放在server hello中,比如session ID,密码套件等。

并且我们看到,除了server hello部分,这个包还有服务器发向客户端的证书的前一部分。然后下一个包TCP segment of a reassemble PDU,是证书的中间部分。

6.然后找到Certificate,这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。

而我们看到的包中内容呢是证书结尾部分,包括GitHub 机构旗下github.com网站的证书及其颁发机构 DigiCert 的证书。

7.下一部分是Server Key Exchange,用于将服务器的临时ECDH公钥传送给客户端。

8.之后是Server Hello Done,此消息由服务器发送,以指示ServerHello和相关消息的结束。
发送此消息后,服务器将等待客户端响应。

9.客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster Key。

然后我们看到下个包包含Client Key Exchange, Change Cipher Spec, Hello Request, Hello Request

10.首先是Client Key Exchange,上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端。

11.Change Cipher Spec(Client),
这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了。然后客户端发送握手验证报文确保消息的完整性。

12.Change Cipher Spec(Server)
这一步是服务端收到数据后,通知客户端后面再发送的消息都会使用加密。

13.Encrypted Handshake Message,表示服务器端的SSL成功结束,发送握手验证报文确保消息的完整性。

14.下面开始正式交换数据。

所以总的过程如下图所示:

以上就是整个SSL握手过程,也是加密算法的典型应用之一。