TLS四次握手相关总结

一、为什么要使用TLS/SSL

明文传播的通信信息存在三大风险:

  • 窃听风险
  • 篡改风险
  • 冒充风险

SSL/TLS协议是为了解决这三大风险而设计的:

  • 所有信息加密传播,第三方无法窃听
  • 具有校验机制,一旦被篡改,通信双方会立即发现
  • 配备身份证书,防止被冒充

二、AES256-ECB运行机制

sequenceDiagram participant Client participant Server Client->>Server:QueryPrivateKey Server->>Server:Static Key Encrypt Session Key Server->>Client:QueryPrivateKeyRsp(Session Key) Client->>Client:Static Key Decrypt Session Key Client->>Server:Connect Server->>Client:ConnectResponse Client->Server:Session Key Encrypt Message loop Client->Server:Encrypted Message end

三、TLS/SSL的运行机制

sequenceDiagram opt 客户端请求 Client->>Server:Client Hello(Client Random) end opt 服务器响应 Server->>Client:Server Hello(Server Random) Server->>Server:CA Private Key Encrypt Server Public Key Server->>Client:Certificate(Server Public Key) Server->>Server:Server Private Key Encrypt Server DH Parameter Server->>Client:Server Key Exchange(Server DH Parameter) Server->>Client:Certificate Request Server->>Client:Sever Hello Done end Client->>Client:CA Public Key Decrypt Server Public Key Client->>Client:Server Public Key Decrypt Server DH Parameter opt 客户端响应 Client->>Client:CA Private Key Encrypt Client Public Key Client->>Server:Certificate(Client Public Key) Client->>Client:Client Private Key Encrypt Client DH Parameter Client->>Server:Client Key Exchange(Client DH Parameter) Client->>Server:Certificate Verify(Signature) Client->>Server:Change Cipher Spec Client->>Server:Finished end Server->>Server:CA Public Key Decrypt Client Public Key Server->>Server:Client Public Key Decrypt Server DH Parameter opt 服务器响应 Server->>Client:Change Cipher Spec Server->>Client:Finished end Client->Server:Session Key = f(CR, SR, g(CDH, SDH)) Client->Server:Public Key Encrypt Session Key Client->Server:Session Key Encrypt Application Data loop Client->Server:Application Data end

1、客户端请求(Client Hello)

客户端向服务端发出加密通信请求消息:Client Hello,提供以下内容:

(1) Version:支持的协议版本,比如TLS 1.2版。
(2) Random:客户端生成的随机数,生成"会话密钥"的第一个参数
(3) Cipher Suites:支持的加密方法,比如RSA公钥加密或DIffie-Hellman算法。
(4) Compression Methods:支持的压缩方法。

2、服务端请求(Server Hello)

服务器收到客户端请求后,向客户端发出回应,服务器的回应包含以下内容:

SeverHello

(1) Version:确认使用的加密通信协议版本,比如TLS 1.2版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) Random:一个服务器生成的随机数,生成"会话密钥"的第二个参数
(3) **CiperSuite:确认使用的加密方法,比如RSA公钥加密或DIffie-Hellman算法。
(4) Compression Methods:使用的压缩方法。

Other

(1) Certificate:服务器证书。存放CA加密后的服务器公钥和服务器身份信息。
(2) Server Key Exchange(DIffie-Hellman):发送加密的服务端DH参数给客户端,后续客户端与服务端之间通过幂运算(DHE)或点乘运算(ECDHE)算出相同的值,做为生成"会话密钥"的第三个参数
(3) Certificate Request:请求客户端证书。
(4) Server Hello Done:消息发送完毕,等待客户端消息。

3、客户端响应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。

(1) Certificate:客户端证书。存放CA加密后的服务器客户端公钥和服务器客户端身份信息。
(2) Client Key Exchange(DIffie-Hellman):发送加密的客户端DH参数服务端,后续客户端与服务端之间通过幂运算(DHE)或点乘运算(ECDHE)算出相同的值,做为生成"会话密钥"的第三个参数
(3) Certificate Verify:私钥签名之前所有的握手数据发给服务器验证,证明这个客户端证书是自己发的。
(4) Change Cipher Spec:编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(5) Finished:客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

4、服务器响应

此时客户端和服务端都收到了对端发送的DH参数,经过数学运算,两端会算数相同的pre-master key。根据:

  • client random(明文)
  • server random(明文)
  • pre-master key(未经信道传输,而是计算而出的密文)

服务器和客户端会根据以上三个参数计算生成本次会话所用的"会话密钥"。

服务端向客户端最后发送下面信息:

(1)Change Cipher Spec:编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)Finished:服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用会话密钥加密内容

FAQ

TLS加密套件

ADD TTTLSPOLICY

ECDHE-RSA-AES256-GCM-SHA384-1
ECDHE-ECDSA-AES256-GCM-SHA384-1
DHE-RSA-AES256-GCM-SHA384-1
ECDHE-RSA-AES128-GCM-SHA256-1
ECDHE-ECDSA-AES128-GCM-SHA256-1
DHE-RSA-AES128-GCM-SHA256-1

幂运算 点乘运算 非对称算法 分组算法 对称算法 散列算法
DHE ECDHE RSA;ECDSA DES;AES ECB;CBC;GCM MD5;SHA
密钥交换算法 签名算法 加密算法 摘要算法
DHE;ECDHE;RSA RSA;ECDSA RSA;ECB;CBC;GCM MD5; SHA

DHE 算法

使用一个质数p的整数模n乘法群以及其原根g

服务端与客户端协定使用 p=23以及base g=5。

服务端选择一个加密后的整数a=6,计算A = ga mod p并发送给客户端。

Server Key Exchange:A = 56 mod 23 = 8

客户端选择一个加密后的整数b=15,计算B = gb mod p并发送给服务端。

Client Key Exchange:B = 515 mod 23 = 19

服务端计算S1 = Ba mod p

196 mod 23 = 2

客户端计算S2 = Ab mod p

815 mod 23 = 2

S1 == S2 = 2, 即为生成"会话密钥"的第三个参数

posted @ 2025-07-07 09:27  谢哥在彼方  阅读(23)  评论(0)    收藏  举报