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、摘要算法 + 数字签名
用摘要算法(哈希函数)来计算出内容的哈希值,这个哈希值是唯一的,且无法通过哈希值推导出内容

这里只能保证内容不被篡改,但是不能保证【内容+哈希值】不会被中途替换,因为缺少内容来源的证明。
为了避免被替换的风险,采用非对称加密算法来解决,公钥、私钥之间可以双向加解密
- 公钥加密,私钥解密。这个目的是为了保证内容传输的安全,“只有我能看到”,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;
- 私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,“只有我能产生”,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。
数字签名采用的就是私钥加密,公钥解密的方式,不过私钥加密内容不是内容本身,而是对内容的哈希值加密。所以哈细值A只能由真正的源头生成,无法被替换

私钥是由服务端保管,然后服务端会向客户端颁发对应的公钥。如果客户端收到的信息,能被公钥解密,就说明该消息是由服务器发送的。
但是现在还存在一种可能:中间人冒充源头,颁发出公钥,然后用自己的私钥加密数字签名,发送信息,依然可以替换真正的网站
5、数字证书
数字证书:由CA(数字证书认证机构)颁发,内容包括:
- 公钥;
- 持有者信息;
- 证书认证机构(CA)的信息;
- CA 对这份文件的数字签名及使用的算法;
- 证书有效期;
- 还有一些其他额外信息
作用:认证公钥持有者的身份,以防止第三方进行冒充,简单来说,就是证明服务端是合法可信的。
工作方式:申请证书,需要被身份验证的一端,向CA机构申请证书,验证证书,拿到证书后验证对端身份
服务端向CA申请注册数字证书,使用CA的私钥将 服务端的「个人信息 + 公钥 + 数字签名(使用私钥对前两者进行哈希得到)」打包成一个数字证书。这样可以确保服务端公钥(用来解密传输内容的数字签名)的来源真实可靠。
如何验证?见下图

二、HTTPS建立连接
SSL/TLS 协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
前两步也就是 SSL/TLS 的建立过程,也就是 TLS 握手阶段
TLS 的「握手阶段」涉及四次通信,使用不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法和 ECDHE 算法
1、RSA算法的握手
阶段一,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」
第二次握手
服务端回复「Server Hello」消息,内容包括:确认的TLS版本、随机数「Server Random」、密码套件
发送「数字证书」
生成随机数作为私钥,选择使用的椭圆曲线,根据曲线基点计算出公钥
发送「Server Key Exchange」消息,内容包括:椭圆曲线(及基点)、根据基点计算出的椭圆曲线公钥(公钥使用RSA算法做了签名,目的是防止公钥被篡改)
最后发送「Server Hello Done」
至此,双方共享的信息包括:「Clienet Random」、「Server Random」、「椭圆曲线」、「椭圆曲线基点」、「服务端公钥」
第三次握手
- 验证数字证书,(在ECDHE握手中,只是验证服务端身份,并没有使用到证书里面的服务端公钥)
- 客户端生成一个随机数作为私钥,然后结合曲线基点,生成客户端的曲线公钥
- 发送「Client Key Exchange」消息,内容是客户端生成的曲线公钥
- 计算「会话密钥」
- 发送「Change Cipher Spec」消息,告知改用对称加密通信
- 发送「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、加密的数学原理:离散对数
- 底数
a
、摸数p
作为公共参数 - 已知
i
,计算出b
很容易 - 通过
b
倒推出i
很困难,尤其是当p
是很大的质数的时候
2、「会话密钥」的计算原理:DH算法
Diffie-Hellman算法,利用离散对数的幂运算的交换律

g
、p
是初始公共参数,a
、b
分别是双方的密钥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)