HTTPS协议详解

从事移动互联网软件开发的小伙伴肯定了解:自Android 9.0开始,应用程序的网络请求默认使用https;基本是同期苹果IOS在应用网络请求方面,也强制使用https禁止http。
这一期间如果你去面试,不了解Https的握手过程,都不好意思讲工资。
本人一个普通程序员,项目期间工期紧张,并未抽出时间详细了解Https网络请求过程中TLS握手过程,因此这件事一直在我的待办记录中...
这篇文章以Wireshark抓包,详细了解Https请求中TLS的握手过程 与 客户端证书校验过程。

HTTPS简介

SSL/TLS握手过程

客户端 证书校验

一、HTTPS简介

HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一种通过计算机网络进行安全通信的传输协议。
HTTPS 利用 SSL/TLS 来加密数据包,经由 HTTP 进行通信。
其设计的主要目的是,提供对网站服务器的身份认证、保护交换数据的隐私与完整性。

https

TLS/SSL

SSL(Secure Socket Layer) 1994年由 浏览器开发商Netscape公司 率先倡导研发,为数据通讯提供安全支持,开发了最初的几个版本SSL 1.0、SSL 2.0、SSL 3.0。

TLS(Transport LayerSecurity)前身为SSL,1999年从 3.1 开始被 IETF(Internet Engineering Task Force,Internet 工程任务组)标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。
SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到;
TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2;

TLS/SSL是介于TCP和HTTP之间的一层安全协议。

https

Http

HTTP(HyperText Transfer Protocol)超文本传输协议。
HTTP是一个客户端(用户)和服务端之间请求和应答的标准,其最初的设计目的是为了提供一种发布和接收HTML页面的方法。

Http协议不是本文重点,感兴趣的同学可参考文章:
HTTP 协议详解
https://blog.csdn.net/xiaxl/article/details/104541274

二、SSL/TLS握手过程

SSL/TLS握手过程用一句话总结就是:用非对称加密的手段传递密钥,然后用密钥进行对称加密传递数据。
以下为SSL/TLS握手过程的时序图:

SSL/TLS握手过程

这里以客户端向百度主页发起Https请求为例,用Wireshark抓包对SSL/TLS握手的各个环节进行介绍,Wireshark抓包示意图如下图所示:

Https请求百度主页WireShark抓包

2.1、Client Hello ( Client——>Server )

握手第一步是客户端向服务端发送 Client Hello 消息,消息中包含客户端的 TSL版本信息、秘钥随机数、加密套件候选列表、压缩算法候选列表、扩展字段等信息,相关信息通过Wireshark抓包如下:

Client Hello

Version : 支持的最高TSL协议版本,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;

Random:随机数 random_C 用于后续的密钥协商;

Session ID:有或者无,有则客户端传上一次session的id可以恢复session;

Cipher Suite:客户端支持的密码算法列表,供服务器选择;

Compression Methods:客户端支持的压缩算法列表,用于后续的信息压缩传输;

extensions:扩展字段;

2.2、Server Hello ( Server——>Client )

服务端向客户端发送 Server Hello 消息:包括服务端选择使用的TSL协议版本、选择的加密套件、选择的压缩算法、服务端生成的随机数等,相关信息通过Wireshark抓包如下:

Server Hello

Version:服务器选择的版本;

Random:随机数 random_S 用于后续的密钥协商;

Session ID:有或者无,有则客户端传上一次session的id可以恢复session;

Cipher Suite:服务端选择的密钥算法;

Compression Methods:服务端选择的压缩算法;

到此客户端和服务端都拥有了两个随机数(random_C+ random_S),这两个随机数会在后续生成对称秘钥时用到。

2.3、Certificate ( Server——>Client )

服务端下发服务端的公钥证书给客户端,相关信息通过Wireshark抓包如下:

Certificate

Certificate 服务端的公钥证书;

2.4、Server Key Exchange ( Server——>Client )

该消息的目的是携带密钥交换的额外数据,该消息内容对于不同的协商算法套件会存在差异:

对于使用DHE/ECDHE非对称密钥协商算法的SSL握手,服务器发送其使用的DH参数;

RSA算法不会继续该握手流程(DH、ECDH也不会发送server key exchange)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypwx.html