HTTPS通信原理与实例分析

HTTPS简介

HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输,通俗点说,就是把HTTPS数据放到了一个带锁的箱子里保护起来,这里的锁就相当于SSL或者TLS。
HTTPS和HTTP的区别:
1.HTTPS需要一个CA根证书,全球公认的CA证书一般都要收费,私人或者企业内部使用一般是自签证书,就是自己创建一个CA证书 。
2. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
3. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

HTTPS作用

1.建立一种安全的信息交互通道。
2.验证服务器或者客户端是否合法。

HTTPS服务器类型

HTTPS服务器分为单向/双向两种服务器类型。
1.单向是指,只是客户端验证服务器的合法性。
2.双向是指,客户端验证服务器合法性,服务器也会验证客户端的合法性。
一般公网里第二种类型比较少,只会在某些网上银行的服务器里出现。

HTTPS通信原理与实例分析

通信原理

HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS,如下图所示。

HTTPS通信原理与实例分析
如上图所示 HTTPS 相比 HTTP 多了一层 SSL/TLS,SSL/TLS层负责客户端和服务器之间的加解密算法协商、**交换、通信连接的建立。
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。

通信流程和实例分析

本人在CentOS7.2虚拟机上,用Flask + Gunicorn简单的部署了一个Demo,并用tcpdump抓包工具抓取通信的数据包,在WIN7上用wireshark分析数据流。
1.客户端发起请求(client_hello)
以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:
HTTPS通信原理与实例分析
• 支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本;
• 客户端支持的加密套件 cipher suites 列表,如图所示,支持43个。 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、**交换算法 KeyExchange(**协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验);
• 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;
• 随机数 random_C,用于后续的**的生成;
• 扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段的作用。
2.服务端收到客户端的请求后,返回结果(server_hello)
• server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的**协商;
HTTPS通信原理与实例分析
• server_certificates, 服务器端配置对应的证书链,包括证书的CN,ON,地域信息,还有创建与过期时间描述,用于身份验证与**交换;
HTTPS通信原理与实例分析
• server_key_exchange,在发送Server Certificate证书消息之后,根据Server Hello选择的算法不同,并且证书里没有足够的数据交换premaster secret预主**,Server就会发送Server Key Exchange消息,交换协商参数,以便双方生成premaster secret预主**。
那么哪些情况会发送,哪些情况不会发送呢? rfc5246 中有以下规定:
. DHE_DSS、DHE_RSA、DH_anon 算法会发送此消息
. RSA、DH_DSS、DH_RSA 算法不会发送此消息
并提供了大致的代码实现:
HTTPS通信原理与实例分析
那么如server hello图所示,该服务器选择了ECDHE算法,所以需要传递server_key_exchange消息。
• server_hello_done,通知客户端 server_hello 信息发送结束;
HTTPS通信原理与实例分析
3.证书校验
客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:
• [证书链]的可信性 trusted certificate path,方法如前文所述;
• 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同;
• 有效期 expiry date,证书是否在有效时间范围;
• 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析;
4.client_key_exchange+change_cipher_spec+encrypted_handshake_message
HTTPS通信原理与实例分析
• client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;
• 此时客户端已经获取全部的计算协商**需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商**;
enc_key=Fuc(random_C, random_S, Pre-Master)
• change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信**和加密算法进行加密通信;
• encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商** session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;
5.change_cipher_spec+encrypted_handshake_message
HTTPS通信原理与实例分析
• New_session_ticket,会话记录,如果客户端和服务器之间曾经建立了连接,服务器会在 new_session_ticket 数据中携带加密的 session_ticket 信息,客户端保存;
• 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商**:enc_key=Fuc(random_C, random_S, Pre-Master);
• 计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和**正确性;
• change_cipher_spec, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的**与算法进行加密通信;
• encrypted_handshake_message, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商** session secret 与算法加密并发送到客户端;

6.握手结束
客户端计算所有接收信息的 hash 值,并采用协商**解密 encrypted_handshake_message,验证服务器发送的数据和**,验证通过则握手完成;

7.注意
• 握手完成之后,双方开始加密通信;
• 服务器也可以要求验证客户端,即双向认证,可以在过程2要发送 client_certificate_request 信息,客户端在过程4中先发送 client_certificate与certificate_verify_message 信息,证书的验证方式基本相同,certificate_verify_message 是采用client的私钥加密的一段基于已经协商的通信信息得到数据,服务器可以采用对应的公钥解密并验证;
• 根据使用的**交换算法的不同,如 ECC 等,协商细节略有不同,总体相似;
• change cipher spec 实际可用于通知对端改版当前使用的加密通信方式,当前没有深入解析;
• alter message 用于指明在握手或通信过程中的状态改变或错误信息,一般告警信息触发条件是连接关闭,收到不合法的信息,信息解密失败,用户取消操作等,收到告警信息之后,通信会被断开或者由接收方决定是否断开连接。

加密算法概述

对称加密

有流式、分组两种,加密和解密都是使用的同一个**。
例如:DES、AES-GCM、ChaCha20-Poly1305等

非对称加密

加密使用的**和解密使用的**是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
例如:RSA、DSA、ECDSA、 DH、ECDHE

哈希算法

将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
例如:MD5、SHA-1、SHA-2、SHA-256 等

数字签名

签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
如果大家还有兴趣,下面链接会详细解释。
扫盲 HTTPS 和 SSL/TLS 协议[3]:**交换(**协商)算法及其原理

参考博文:
https://blog.****.net/hherima/article/details/52469674