HTTPS是一种基于响应HTTP的加密传输协议,相比HTTP增加了一层安全保护。在HTTPS建立连接的过程中,密钥交换是非常关键的部分。
以下是HTTPS握手过程中的密钥交换步骤:
- 客户端请求连接至服务器,随机生成对称密钥。
客户端(浏览器)通过TCP协议连接到服务器,发送一个ClientHello消息,包含以下信息:
- 支持的协议版本
- 支持的加密算法列表
- 生成的随机数1(Client random)
客户端还会生成一个对称密钥(session key),用于加密通信数据。
- 服务端回应,发送密钥协商参数以及证书。
服务端接收到客户端的请求后,发送一个ServerHello消息,包含以下信息:
- 协商的使用的协议版本
- 确定使用的加密算法
- 生成的随机数2(Server random)
此外,服务端还会发送其证书(certificate)供客户端验证其身份。
- 密钥协商阶段。
在服务端回应消息中,包含了加密通信数据所需要的密钥协商参数。这些参数中包括:
- 协商的对称加密算法
- 协商的密钥交换算法
- 服务器的公钥(如果协商的是RSA密钥交换算法)
如果协商的是RSA密钥交换算法,则服务端会将信封(EncryptedPreMasterSecret)发送给客户端,这个信封是使用RSA加密的。客户端收到信封之后,使用自己生成的随机数和服务器发送的公钥,解密出对称密钥。服务端和客户端都知道这个共享的对称密钥,以便加密通信数据。
如果协商的是Diffie-Hellman密钥交换算法,那么服务端会发送Diffie-Hellman公钥给客户端,在客户端也发送自己的Diffie-Hellman公钥给服务端。服务端和客户端通过各自的公钥计算出对称密钥,用于加密通信数据。
- 握手完成。
客户端自己使用生成的随机数、服务器生成的随机数和共享的对称密钥对一段信息(verify_data)进行加密并发送给服务器,用来检查服务器是否能正确解密数据,如果数据解密正确,密钥交换流程就完成了。
以上是HTTPS握手过程中的密钥交换步骤。
下面我们以RSA密钥交换算法为示例,详细说明一下密钥交换过程。
- 客户端请求连接至服务器,随机生成对称密钥。
客户端发送的ClientHello消息如下:
支持的协议版本:TLSv1.2
支持的加密算法列表:ECDHE-RSA-AES128-GCM-SHA256, AES128-SHA256, AES128-SHA, ECDHE-RSA-AES256-GCM-SHA384, AES256-SHA256, AES256-SHA, ECDHE-RSA-AES256-SHA384, ECDHE-RSA-AES128-SHA256, ECDHE-RSA-AES256-SHA, ECDHE-RSA-AES128-SHA
生成的随机数1: 2d 5d 3a 32 7d 12 8b c7 a2 57 4f 4b 40 03 21 ef 1e 35 7f 95 8e c7 1c b6 1f 15 f8 69 f7 a2 67
客户端还会生成一个对称密钥,用于加密通信数据。
session key: e0 fd 7d b7 8e d7 d7 c1 1c 6b 0c ed 7e bd d2 2e
- 服务端回应,发送密钥协商参数以及证书。
服务端回应的ServerHello消息如下:
协商的使用的协议版本:TLSv1.2
确定使用的加密算法:ECDHE-RSA-AES128-GCM-SHA256
生成的随机数2:bf 4d 88 64 b1 6a 1e 68 6d ca 91 91 fa 9a 4a d0 d0 92 45 1a 83 8a e1 47 86 28 d0 9b 8c de 38
服务端还发送了自己的证书供客户端验证服务端身份。
- 密钥协商阶段。
服务端接收到客户端的请求后,根据客户端的ClientHello信息,确定协商的使用的加密算法为 "ECDHE-RSA-AES128-GCM-SHA256"。同时,也确定了RSA密钥交换算法,服务端会将信封(EncryptedPreMasterSecret)发送给客户端,这个信封使用服务端的公钥进行加密。服务端发送的密钥协商参数如下:
加密通信使用的对称加密算法:AES128-GCM
密钥交换算法:RSA
服务端的RSA公钥:6a 2a 71 38 65 7a 30 47 60 76 c0 8b cd 6b 2c 07 6c a2 2a 55 3d 3d 1e bf 32 b8 56 23 fa ec ba ae b6 26 1b 24 16 57 78 58 fa 87 e8 27 d9 9f bb ac 5d 51 96 d0 1e 57 2c 25 c4 f0 26 4b 4f 99 f4 65 08 8e 85 82 50 86 c5 b2 5f a9 40 3c e5 b5 47 8f 56 1d 57 b5 06 4e 8b ff 4c 1e 82 ec ec 56 eb 82 fc de 60 1f c0 39 17 8f 7d 2a 79 a7 d2 bc 8b 7e 3d 97 c1 17 53
客户端收到服务端发送的密钥协商参数之后,使用服务端发送的公钥,将密文(EncryptedPreMasterSecret)解密出明文(PreMasterSecret)。解密的过程如下:
EncryptedPreMasterSecret: 01 6a a2 7b e8 79 1b 2d 82 c6 4b d0 4e 68 44 92 85 bd e5 fe f0 98 e4 a6 15 58 f2 43 01 19 eb d3 ad 51 88 07 6d 47 dd a7 c0 d1 6c 9b 05 02 88 42 99 52 eb 84 7d 59 1f 29 16 69 3d 1a e8 97 7c fb a3 f5 3d 8d 5f 50 d3 04 67 64 b8 51 02 fc b5 16 ae 4d 4d d4 c4 4b 57
ServerPublicKey: 6a 2a 71 38 65 7a 30 47 60 76 c0 8b cd 6b 2c 07 6c a2 2a 55 3d 3d 1e bf 32 b8 56 23 fa ec ba ae b6 26 1b 24 16 57 78 58 fa 87 e8 27 d9 9f bb ac 5d 51 96 d0 1e 57 2c 25 c4 f0 26 4b 4f 99 f4 65 08 8e 85 82 50 86 c5 b2 5f a9 40 3c e5 b5 47 8f 56 1d 57 b5 06 4e 8b ff 4c 1e 82 ec ec 56 eb 82 fc de 60 1f c0 39 17 8f 7d 2a 79 a7 d2 bc 8b 7e 3d 97 c1 17 53
PreMasterSecret: 03 03 18 5e 99 d3 5e 22 71 41 3b d5 ee 21 8b 86 08 1b 99 4d 1d 60 4a f0 57 4b 91 8f 0f 92 6b 36
客户端使用解密后的明文PreMasterSecret和刚刚生成的随机数1、随机数2生成一个PreMasterSecret,服务端和客户端都知道这个共享的对称密钥。
PreMasterSecret: 03 03 3c 27 bc 5f c8 40 9e 86 ff 99 1f 77 b4 96 1e 4c 4b 01 96 10 64 b2 f1 99 e6 92 8b a8 7d
- 握手完成。
客户端使用生成的随机数、服务器生成的随机数和共享的对称密钥对一段信息verify_data进行加密并发送给服务器。如果服务器成功解密出数据,说明密钥交换流程已经完成。
verify_data: ab 41 63 fa 98 7a 2f d8 e7 22 70 68 7a c0 8c df 60 73 6c 7e 34 96 f0 21 03 4f 18 68 a8 96 9b 2b
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTTPS握手过程中的密钥交换是如何进行的? - Python技术站