网络2️⃣HTTPS-密钥交换算法
SSL/TLS
HTTPS 是在
TCP
和HTTP
之间添加SSL/TLS
安全协议,解决 HTTP 的安全性问题。
- 在 HTTP 中,通信之前需要进行 TLS 握手。
- 密钥交换算法:不同密钥交换算法的 TLS 握手流程不同。
- TLS/1.2:采用 RSA 和 DH。
- TLS/1.3:采用 ECDHE。
RSA 握手
四次握手
-
Wireshark 抓包:
-
示意图:
第一次握手
Client Hello
Client Hello
:客户端向服务器发起加密通信请求。
-
客户端随机数(用于生成会话密钥)
-
客户端支持的 TLS 版本(e.g. TLS/1.2)
-
客户端支持的密码套件列表(e.g. RSA)
第二次握手
Server Hello
Sever Hello
:服务器收到客户端请求后,发出响应。
-
服务器随机数(用于生成会话密钥)
-
服务端确认 TLS 版本
-
服务端确认密码套件列表
密码套件格式:
TLS_
密钥交换算法
_签名算法
_WITH_对称加密算法
_摘要算法
。
示例:TLS_RSA_WITH_AES_128_GCM_SHA256
- TLS
- RSA:本来 WITH 前有 2 个单词,此处代表密钥交换算法和签名算法都是 RSA。
- WITH
- AES_128_GCM:握手后通信采用 AES 作为对称加密算法,密钥长度 128 位,分组模式是 GCM。
- SHA256:摘要算法,用于消息认证和产生随机数。
Certificate
Server Certificate
:服务器的数字证书。
Server Hello Done
Server Hello Done
:代表 Server 第一次响应结束。
客户端校验证书
客户端拿到了服务端的数字证书后,需要校验数字证书的真实性。
数字证书和 CA
数字证书:用于认证公钥持有者的身份,防止第三方冒充。
i.e. 告诉客户端,该服务端身份是否可信。
数字证书的本质是文件,包含以下信息。
- 公钥
- 持有者信息
- CA 信息
- CA 数字签名及使用的算法
- 证书有效期
- 其它信息
数字证书认证机构(Certificate Authority)
- 网络中具有极高可信度的公证中心。
- CA 拥有一对公钥和私钥。
- CA 私钥保密,用于对服务器公钥加密生成数字签名。
- CA 公钥已预先内置到浏览器或操作系统中,用于验证签名真实性。
数字证书签发和验证
CA 签发证书
- 将服务器公钥、用途、颁发者、有效时间等信息打包,进行哈希计算得到一个 Hash 值。
- 使用 CA 私钥对 Hash 值加密,生成 CA 数字签名。
- 将 CA 数字签名 添加在文件证书上,形成数字证书。
客户端
-
使用相同的哈希算法,计算服务器数字证书信息的 Hash 值(H1)。
-
使用 CA 公钥对服务器数字证书中的数字签名解密(得到 H2)。
-
对比 H1 和 H2,相同说明证书是由 CA 真实提供的,否则说明是伪造的。
-
从数字证书中获取服务器公钥,使用它对报文进行加密发送。
第三次握手
客户端验证证书可信后,准备第三次握手。
Client Key Exchange
Client Key Exchange
:发送预主密钥(pre-master
)
-
生成随机数(预主密钥,用于生成会话密钥)。
-
使用服务器公钥加密后发出。
生成会话密钥(
Master Secret
):用于后续 HTTP 通信的对称加密。
- 客户端:根据双方协商的算法,结合三个随机数生成本次通信的会话密钥。
- 服务器:收到客户端发送的预主密钥后(使用服务器私钥解密),同理得到一个相同的会话密钥。
Change Cipher Spec
Change Cipher Spec
:通知服务器,之后使用会话密钥进行加密通信。
Finished
Finished
(Encrypted Handshake Message):客户端握手结束
-
将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出。
-
用于服务端校验,验证加密通信是否可用、握手信息是否有被中途篡改过。
第四次握手
Change Cipher Spec
Change Cipher Spec
:之后使用会话密钥进行加密通信。
Finished
Finished
(Encrypted Handshake Message):服务端握手结束
- 将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出。
- 用于客户端校验。
客户端校验通过后,握手正式完成。
之后采用会话密钥进行对称加密通信。
RSA 缺陷 - 前向保密
RSA 不支持前向保密(aka. 前向安全)
- 客户端传递的预主密钥(pre-master)是用服务器公钥加密的。
- 如果服务器私钥泄漏,过去被第三方截获的 TLS 通信密文都会被破解。
ECDHE 握手
算法说明
ECDHE 由 DH 演进而来。
DH 是非对称加密算法,可用于密钥交换。
离散对数
DH 算法的核心数学思想是离散对数(对数运算 + 模运算)
-
参数:根据以下参数,可以计算出真数 b。
-
公共参数:底数 a,模数 p
-
私有参数:离散对数 i
-
-
反之,很难通过公共参数和真数来反推离散对数(尤其是 p 很大时)。
DH 算法
假设主机 A 和主机 B 通信,约定使用 DH 来交换密钥。
- 确定公共参数:双方确定底数 G 和模数 P。
- 随机生成私钥:双方各自生成一个随机整数作为私钥,分别用 a 和 b 代称。
- 计算公钥:根据公共参数和私钥生成,各自生成公钥。
- 主机 A 公钥 = Ga % P
- 主机 B 公钥 = Gb % P
- 交换公钥:此时双方都有公共参数(P, G)、双方公钥(A, B)和各自的私钥(a/b)
- 计算会话密钥:用对方的公钥作为底数,各自的私钥作为离散对数,对相同的模数计算得到相同密钥值。
- 主机 A:Ba % P = Gab % P = K
- 主机 B:Ab % P = Gba % P = K
DHE 算法
根据私钥生成的方式,DH 算法分为两种实现。
- static DH(已废弃):不具备前向安全性。
- 每次密钥交换时有一方的私钥是静态的。通常是服务器私钥固定,客户端私钥随机生成。
- 随着时间延长,黑客截获海量的密钥协商过程的数据,暴力破解出服务器私钥,从而计算出会话密钥,破解过去的通信密文。
- DHE(常用):Ephemeral 临时性的。
- 每次密钥交换时双方的密钥都是随机生成的。
- 每次通信过程的私钥不同,保证了前向安全
- 缺点:需要做大量乘法运算,性能差。
ECDHE 算法 🔥
ECDHE:DHE 算法 + ECC 椭圆曲线特性。
使用更少的计算量来计算公钥和会话密钥。
交互流程:
- 确定公共参数:双方事先确定椭圆曲线和曲线上的基点 G。
- 随机生成私钥,计算公钥:双方各自生成一个随机数作为私钥(记 d),计算公钥(记 Q = dG)
- 主机 A 的公私钥:Q1, d1
- 主机 B 的公私钥:Q2, d2
- 交换公钥:此时双方都有公共参数(椭圆曲线,G)、双方公钥(Q1, Q2)和各自的私钥(d1/d2)
- 计算共享密钥:用对方的公钥 + 各自的私钥,得到相同的 x 坐标。
- 主机 A:计算点 (x1, y1) = d1Q2 = d1d2G
- 主机 B:计算点 (x2,y2) = d2Q1 = d2d1G
关于椭圆曲线的运算 👉 技术蛋老师:ECC椭圆曲线加密算法原理
ECDHE 握手过程
四次握手
- ECDHE 第三次握手时就发送了加密数据,而不需要等到四次握手结束(RSA 需要)。
- 因此,ECDHE 比 RSA 握手过程节省了一个 RTT(aka. TLS False Start)。
第一次握手
Client Hello
同 RSA
-
客户端随机数
-
客户端支持的 TLS 版本
-
客户端支持的密码套件列表
第二次握手 🔥
Server Hello
与 RSA 区别在于,密码套件不同。
-
服务器随机数
-
服务端确认 TLS 版本
-
服务端确认密码套件列表
密码套件:相比 RSA,密钥交换算法改成了 ECDHE
示例:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS
- ECDHE:密钥交换算法
- RSA:签名算法
- WITH
- AES_256_GCM:握手后通信采用 AES 作为对称加密算法,密钥长度 256 位,分组模式是 GCM。
- SHA384:摘要算法,用于消息认证和产生随机数。
Certificate
发送服务器的数字证书
Server Key Exchange 🔥
RSA 中没有这一步
-
确认椭圆曲线和基点 G(对客户端公开)
-
生成私钥:生成随机数作为服务端椭圆曲线的私钥。
-
计算公钥:
- 根据基点 G 和私钥,计算服务端的椭圆曲线公钥(对客户端公开)。
- 为了防止公钥被篡改,会用 RSA 算法做个签名。
-
发送上述的公开信息。
Server Hello Done
代表 Server 第一次响应结束。
第三次握手
客户端收到服务端的证书后,需要进行校验。
验证其可信性后,准备第三次握手。
Client Key Exchange 🔥
- 生成私钥:生成随机数作为客户端椭圆曲线的私钥。
- 计算公钥:根据基点 G 和私钥,计算客户端的椭圆曲线公钥。
- 发送公钥
至此:客户端和服务端都有双方公钥、各自私钥、椭圆曲线和基点 G。
根据 ECDHE 原理计算点 (x, y),其中 x 坐标值相同(共享密钥)。
计算会话密钥:客户端随机数 + 服务端随机数 + 共享密钥 x,三个材料而成。
Change Cipher Spec
通知服务端,之后使用会话密钥进行对称加密通信。
Finishied
客户端握手结束
将之前发送的数据做一个摘要,使用会话对称密钥加密后发出(用于服务端校验)。
第四次握手
Change Cipher Spec
之后使用会话密钥进行对称加密通信。
Finishied
服务端握手结束
将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出(用于客户端校验)
客户端校验通过后,握手正式完成。之后采用会话密钥进行对称加密通信。