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 握手过程,也是加密算法的典型应用之一。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于