HTTPS

本文最后更新于:8 个月前

HTTPS 解决了 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输

HTTPS

HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。

一、SSL / TLS

1、概述

SSL和TLS都是加密协议。SSL,全称Secure Socket Layer ,安全套接层。TLS,全称Transport Layer Security 传输层安全,是1999年基于SSL3.0版本上改进而来的。官方建议弃用SSL而保留和采用TLS,但是由于历史原因,SSL仍然存在,而且很多人已经习惯SSL这个名词,因此现在索性就叫成SSL/TLS

SSL/TLS 协议 建立在 TCP 和 HTTP 之间。HTTPS 在三次握手之后,还要进行 SSL/TLS 握手过程,才可以进行加密传输。

HTTP的端口是 80,HTTPS的端口是 443

TLS1.0 = SSL3.1

2、作用

SSL/TLS做的事情,有以下三点:

  • 数据加密,防窃听,使用对称加密和非对称加密
  • 完整性校验,防篡改,通过摘要算法防止加密内容被篡改,通过数字签名防止加密内容被替换
  • 身份验证,防冒充,使用数字证书,验证来源身份

3、混合加密

对称加密:使用1个相同的密钥加解密,速度快

非对称加密:使用2个密钥,公钥加密内容、私钥解密内容,安全性高、速度慢

HTTPS做法:

密钥交换:客户端生成随机密钥S,用服务端数字证书中的公钥将S加密,发送给服务端,服务端收到并用自己的私钥进行解密,获得随机密钥S。之后两边就用S进行加密传输

常用的密钥交换算法有:RSA、ECDHE

4、摘要算法 + 数字签名

用摘要算法(哈希函数)来计算出内容的哈希值,这个哈希值是唯一的,且无法通过哈希值推导出内容

img

这里只能保证内容不被篡改,但是不能保证【内容+哈希值】不会被中途替换,因为缺少内容来源的证明。

为了避免被替换的风险,采用非对称加密算法来解决,公钥、私钥之间可以双向加解密

  • 公钥加密,私钥解密。这个目的是为了保证内容传输的安全,“只有我能看到”,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;
  • 私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,“只有我能产生”,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。

数字签名采用的就是私钥加密,公钥解密的方式,不过私钥加密内容不是内容本身,而是对内容的哈希值加密。所以哈细值A只能由真正的源头生成,无法被替换

img

私钥是由服务端保管,然后服务端会向客户端颁发对应的公钥。如果客户端收到的信息,能被公钥解密,就说明该消息是由服务器发送的。

但是现在还存在一种可能:中间人冒充源头,颁发出公钥,然后用自己的私钥加密数字签名,发送信息,依然可以替换真正的网站

5、数字证书

数字证书:由CA(数字证书认证机构)颁发,内容包括:

  • 公钥;
  • 持有者信息;
  • 证书认证机构(CA)的信息;
  • CA 对这份文件的数字签名及使用的算法;
  • 证书有效期;
  • 还有一些其他额外信息

作用:认证公钥持有者的身份,以防止第三方进行冒充,简单来说,就是证明服务端是合法可信的。

工作方式:申请证书,需要被身份验证的一端,向CA机构申请证书,验证证书,拿到证书后验证对端身份

服务端向CA申请注册数字证书,使用CA的私钥将 服务端的「个人信息 + 公钥 + 数字签名(使用私钥对前两者进行哈希得到)」打包成一个数字证书。这样可以确保服务端公钥(用来解密传输内容的数字签名)的来源真实可靠。

如何验证?见下图

img

二、HTTPS建立连接

​ SSL/TLS 协议基本流程:

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。
  • 双方采用「会话秘钥」进行加密通信。

前两步也就是 SSL/TLS 的建立过程,也就是 TLS 握手阶段

TLS 的「握手阶段」涉及四次通信,使用不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法ECDHE 算法

1、RSA算法的握手

HTTPS 连接建立过程

阶段一,ClientHello

客户端发起加密通信请求,主要发送以下信息:

  • 客户端支持的 TLS 协议版本,如 TLS 1.2 版本
  • 客户端生产的随机数(Client Random),后面用于生成「会话秘钥」条件之一
  • 客户端支持的密码套件列表,如 RSA 加密算法

阶段二,ServerHello

服务端收到请求后,发出响应,回应内容如下:

  • 确认 TLS 协议版本,如果浏览器不支持,则关闭加密通信
  • 服务器生产的随机数(Server Random),也是后面用于生产「会话秘钥」条件之一
  • 确认的密码套件列表,如 RSA 加密算法
  • 数字证书

阶段三,客户端验证数字证书,回应

客户端通过浏览器或者操作系统中的CA公钥,确认「数字证书」的真实性,并取出服务器的公钥,然后使用它加密报文,向服务器发送以下信息:

  • 一个随机数(pre-master key)。该随机数会被服务器公钥加密。
  • 通信算法改变通知,表示之后的信息都将用「回话密钥」加密通信
  • 客户端握手结束通知,同时把之前所有内容的发生的数据做个摘要,供服务端校验

阶段四,服务器回应

服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」

然后,向客户端发送最后的信息:

  • 加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验

TLS握手结束,之后就使用http协议通信,用TLS加密

在上述握手过程中,分别产生了3个「随机数」(Client Random、Server Random、pre-master key),它们在客户端和服务端各存在一份,「会话密钥」就用双方协商的加密算法,结合这3个「随机数」产生。、;

RSA算法的缺陷:不支持前向保密,即只要服务端的密钥泄露,过去所有被第三方截获的所有通讯密文都会被破解。

2、ECDHE 的握手 「重点」

目前服务器广泛应用的「密钥交换算法」

第一次握手

向服务端发送「Client Hello」消息,内容包括:客户端使用的TLS版本、支持的密码套件列表注:密钥套件指第【三】节的四种算法、生成的随机数「Client Random」

第二次握手

  1. 服务端回复「Server Hello」消息,内容包括:确认的TLS版本、随机数「Server Random」、密码套件

  2. 发送「数字证书」

  3. 生成随机数作为私钥,选择使用的椭圆曲线,根据曲线基点计算出公钥

    发送「Server Key Exchange」消息,内容包括:椭圆曲线(及基点)、根据基点计算出的椭圆曲线公钥(公钥使用RSA算法做了签名,目的是防止公钥被篡改)

  4. 最后发送「Server Hello Done」

至此,双方共享的信息包括:「Clienet Random」、「Server Random」、「椭圆曲线」、「椭圆曲线基点」、「服务端公钥」

第三次握手

  1. 验证数字证书,(在ECDHE握手中,只是验证服务端身份,并没有使用到证书里面的服务端公钥)
  2. 客户端生成一个随机数作为私钥,然后结合曲线基点,生成客户端的曲线公钥
  3. 发送「Client Key Exchange」消息,内容是客户端生成的曲线公钥
  4. 计算「会话密钥」
  5. 发送「Change Cipher Spec」消息,告知改用对称加密通信
  6. 发送「Eccrypted Handshake Message」消息,把之前的所有数据做一个摘要,再用对称密钥加密,发送给服务端验证本次生成的对称密钥是否可以使用

至此,两端已经达到了使用 ECDHE 算法生成「会话密钥」的条件、不过最终的密钥并不是 ECDHE 生成的 「x」 值,而是「 Client Random + Server Random + x」,这样做的目的是避免伪随机数

第四次握手

服务端发送「Change Cipher Spec」和「Encrypted Handshake Message」消息,验证加密、解密是否正常

之后握手完成,就可以对称加密通信了

三、各种算法区分

1、密钥协商算法

作用:在客户端和服务端之间协商产生「会话密钥」,保证它不会在传输过程中泄露

  • RSA,达不到前向安全
  • ECDHE,每次都使用不同的私钥,因此是前向安全的,目前被广泛使用

2、签名算法:防伪造

使用私钥加密内容,把公钥颁发出去让别人解密内容。自己的公钥只能解开用自己的私钥加密的内容,以此保证内容就是我写的

在实际操作过程,一般不对原始内容加密,而是对原始内容的哈希值加密

  • MD5withRSA
  • SHA1withRSA
  • SHA256withRSA

with前面的表示摘要算法

3、对称加密算法

  • AES

4、摘要算法:防篡改

针对内容,使用Hash算法计算出一个唯一的Hash值;内容不同,Hash值就不同。作用是查看内容是否被改动

常用的摘要算法:

  • MD5
  • SHA1
  • SHA256
  • SHA512

摘要算法的特点:

  • 摘要算法是一个输入敏感、输出长度固定的不可逆算法(不能由结果推出内容,可以用来保存密码)
  • 用相同的摘要算法对同一个数据进行两次计算,输出结果必然相同
  • 摘要算法计算的过程不需要密钥(但是可以加盐,也就是把密钥作为数据的一部分进行计算)

四、ECDHE算法介绍

1、加密的数学原理:离散对数

img

  • 底数a、摸数p作为公共参数
  • 已知i,计算出b很容易
  • 通过b倒推出i很困难,尤其是当p是很大的质数的时候

2、「会话密钥」的计算原理:DH算法

Diffie-Hellman算法,利用离散对数的幂运算的交换律

img
  • gp是初始公共参数,ab分别是双方的密钥
  • A是甲方根据初试公共参数和私钥计算出的公钥,传给乙方
  • B是乙方根据初始公共参数和私钥计算出的公钥,传给甲方
  • 甲乙双方分别使用对方给的公钥、自己的私钥、其中一个初试公共参数,计算得到相同的「会话密钥」

3、DHE算法

E代表每次使用不同的密钥

4、ECDHE算法

DHE需要做大量的乘法,计算耗时。于是出现了改进版

ECDHE 算法是在 DHE 算法的基础上利用了 ECC 椭圆曲线特性,可以用更少的计算量计算出公钥,以及最终的会话密钥

具体做法如下:

  • 双方事先确定好使用哪种椭圆曲线,和曲线上的基点 G,这两个参数都是公开的;
  • 双方各自随机生成一个随机数作为私钥d,并与基点 G相乘得到公钥Q(Q = dG),此时小红的公私钥为 Q1 和 d1,小明的公私钥为 Q2 和 d2;
  • 双方交换各自的公钥,最后小红计算点(x1,y1) = d1Q2,小明计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥

其中涉及到的数据:

  • 椭圆曲线和基点,作为「初试公共参数」,两个随机数私钥
  • Q,甲方生成的公钥
  • P,乙方生成的公钥
  • 甲乙双方分别使用对方给的公钥、自己的私钥、椭圆曲线,计算得到相同的「会话密钥」

通过与上面第2点,DH算法比较,发现两者在结构上是一致的

参考文章

GoLang:你真的了解HTTPS吗? - 知乎 (zhihu.com)

3.1 HTTP 常见面试题 | 小林coding (xiaolincoding.com)

3.3 HTTPS RSA 握手解析 | 小林coding (xiaolincoding.com)

3.4 HTTPS ECDHE 握手解析 | 小林coding (xiaolincoding.com)


HTTPS
http://timegogo.top/2022/10/05/HTTP/HTTPS/
作者
丘智聪
发布于
2022年10月5日
更新于
2023年7月16日
许可协议