HTTPS 的概念、原理及工作机制

本文主要介绍 HTTPS 概念、原理已经具体的交互方式。可以先了解一下相关知识HTTPS 基础知识(密钥、对称加密、非对称加密、数字签名、数字证书)

HTTPS 概念

  • HTTP (HyperText Transfer Protocol) 是超文本传输协议,它基于 TCP 实现,TCP 本身就没有安全策略,所以 HTTP 也是不安全的。
  • SSL/TLS (Secure Sockets Layer/Transport Layer Security) TLS/SSL 协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL 中使用了非对称加密,对称加密以及 HASH 算法。
  • HTTPS (HTTP over SSL | TLS) 是安全超文本传输协议,是在 TCP 之上进行了加密之后,再基于 HTTP 传输。HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的加密密钥。

HTTPS 工作原理

客户端和服务器端通过协商机制得到一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。

  • 协商机制采用非对称加密保证安全
  • 使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全
  • 使用对称加密、解密传输数据

SSL/TLS 交互过程

下面内容摘于 HTTPS 协议原理和流程深入理解HTTPS协议

目标访问地址 github 抓出包如下, TLSv1 就是加密层。

DK_BurNIng

1. 双方协商交互参数

客户端发送 ClientHello 消息,组成部分如下:

  • 客户端生成的随机数(RNc=Random Number of Client):后面用于生成“会话密钥”
  • 支持的 SSL/TLS 协议版本:比如 TLS1.2
  • 支持的加密算法: 比如RSA公钥加密
  • 支持的压缩算法
图片来源:DK_BurNIng

服务端响应 ServerHello 消息,组成部分如下:

  • 服务端生成的随机数(RNs=Random Number of Server):后面用于生成“会话密钥”
  • 确认使用的 SSL/TLS 协议版本:比如 TLS1.2,这是挑选的双方都支持的协议版本,如果没有共同版本,则握手失败
  • 确认使用的加密算法: 比如RSA公钥加密
  • 确认使用的压缩算法
图片来源:DK_BurNIng

2. 双方交换并验证证书

服务端和客户端都可以有证书(客户端证书只出现在对安全性要求极高的情形,比如银行向用户提供的U盾里就包含有客户端证书),以证明自己身份的真实性。
证书包含自己的名称、受信任的证书颁发机构(CA)和自己的公钥,这些证书通常基于 X.509
证书验证的依据是:双方都预先安装公信的根证书颁发机构证书,可使用它们来验证双方的证书的有效性。
需要注意的是,握手阶段的通信都是明文的。

  • 服务端:向客户端发送服务端证书(证书中包含服务端公钥),并向客户端索要客户端证书;
  • 客户端:收到服务端证书后,验证其身份有效性(可信机构颁发、域名一致、未过期等),如验证失败则握手失败,如成功则从中取出服务端公钥;
  • 客户端:向服务端发送客户端证书(证书中包含客户端公钥);
  • 服务端:收到客户端证书后,验证其身份真实性,如验证失败则握手失败。


    图片来源:DK_BurNIng 服务器发送证书

双方生成 主密钥

  • 客户端对随机数值(RNc+RNs)作哈希,并用自己的公钥私钥、对方公钥签名,并发送给服务端;
  • 服务端以同样算法(自己的公钥私钥、对方公钥),检查客户端发送的哈希签名;
  • 客户端生成随机数,称之为“预置主密钥”(PMS=Pre Master Secret),用于“主密钥”的因子。并用客户端私钥加密,再发送给服务端,服务端使用客户端公钥解密取得 PMS,至此双方有相同的 PMS;
  • 双方使用一致的算法生成相同的“主密钥”(MS=Master Secret):RNc+RNs+PMS,然后使用自己的公钥和私钥,再加上对方的公钥。
图片来源:DK_BurNIng 生成主密钥

完成握手并开始交互

双方都使用“主密钥”作为加密和解密的密钥,完成握手。
此后,数据传输的记录层 (Record layer) 数据可以被随意压缩、加密,对方可以还原为普通的 HTTP 请求,进行交互。


图片来源:DK_BurNIng

主题流程

图片来源:王克锋

参考文章:
HTTPS 协议原理和流程
深入理解HTTPS协议
也许,这样理解HTTPS更容易