HTTPS 的密钥交换过程是基于 TLS(Transport Layer Security)协议实现的,其核心目标是通过加密和认证机制确保通信双方的安全性。以下是详细的 HTTPS 密钥交换过程的时序图,包括具体加密算法和细节。
HTTPS 密钥交换过程详细时序图
Client Server ClientHello 包含以下内容: - 支持的 TLS 版本 (如 TLS 1.3) - 支持的加密套件列表 (Cipher Suites) - 随机数 (ClientRandom) - 扩展信息 (如 SNI) ServerHello 包含以下内容: - 选定的加密套件 (如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) - 随机数 (ServerRandom) - 服务器证书 (包含公钥) - 可选的 ServerKeyExchange (ECDHE 参数) - ServerHelloDone ClientKeyExchange 客户端发送自己的公钥 (ClientPublicKey) ServerKeyExchange 服务器发送自己的公钥 (ServerPublicKey) 双方计算共享密钥 (SharedSecret): - 客户端: SharedSecret = EllipticCurveMultiply(ServerPublicKey, ClientPrivateKey) - 服务器: SharedSecret = EllipticCurveMultiply(ClientPublicKey, ServerPrivateKey) 使用 PRF 生成会话密钥: MasterSecret = PRF(Pre-MasterSecret, "master secret", ClientRandom + ServerRandom) SessionKeys = PRF(MasterSecret, "key expansion", ClientRandom + ServerRandom) Finished 包含握手消息的哈希值 (使用会话密钥加密) Finished 包含握手消息的哈希值 (使用会话密钥加密) Encrypted Application Data Encrypted Application Data Client Server
1. 客户端发起连接请求
客户端向服务器发送一个 ClientHello
消息,包含以下内容:
-
支持的 TLS 版本(如 TLS 1.2 或 TLS 1.3)。
-
支持的加密套件列表(Cipher Suites),例如:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
(ECDHE 密钥交换 + RSA 认证 + AES 加密)。
-
随机数
ClientRandom
(用于后续密钥生成)。 -
可选的扩展信息(如支持的压缩方法、SNI 等)。
Client -> Server: ClientHello
TLS Version: TLS 1.3
Cipher Suites: [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, ...]
Random: ClientRandom
Extensions: [SNI, Supported Groups, Signature Algorithms, ...]
2. 服务器响应
服务器收到 ClientHello
后,选择合适的加密套件,并返回 ServerHello
消息,包含以下内容:
-
选定的加密套件(如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
)。 -
随机数
ServerRandom
(用于后续密钥生成)。 -
服务器证书(包含公钥,用于身份验证)。
-
可选的
ServerKeyExchange
消息(在某些情况下需要,例如使用 DHE 或 ECDHE 密钥交换时)。 -
可选的
CertificateRequest
消息(如果需要客户端认证)。 -
ServerHelloDone
消息(表示服务器完成初始握手消息)。Server -> Client: ServerHello
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Random: ServerRandom
Certificate: ServerCert (包含公钥)
ServerKeyExchange: (可选,ECDHE 参数)
ServerHelloDone
3. 密钥交换(ECDHE 示例)
在此阶段,客户端和服务器通过密钥交换算法(如 ECDHE)协商出共享密钥(Pre-Master Secret)。以下是 ECDHE 的具体步骤:
3.1 客户端生成 ECDHE 参数
客户端根据服务器提供的椭圆曲线参数(如 secp256r1
),生成自己的临时私钥和公钥:
- 客户端私钥:
ClientPrivateKey
。 - 客户端公钥:
ClientPublicKey = EllipticCurveMultiply(BasePoint, ClientPrivateKey)
。
客户端将 ClientPublicKey
发送给服务器。
Client -> Server: ClientKeyExchange
Public Key: ClientPublicKey
3.2 服务器生成 ECDHE 参数
服务器同样生成自己的临时私钥和公钥:
- 服务器私钥:
ServerPrivateKey
。 - 服务器公钥:
ServerPublicKey = EllipticCurveMultiply(BasePoint, ServerPrivateKey)
。
服务器将 ServerPublicKey
发送给客户端。
Server -> Client: ServerKeyExchange
Public Key: ServerPublicKey
3.3 计算共享密钥
客户端和服务器分别使用对方的公钥和自己的私钥计算共享密钥:
- 客户端计算:
SharedSecret = EllipticCurveMultiply(ServerPublicKey, ClientPrivateKey)
。 - 服务器计算:
SharedSecret = EllipticCurveMultiply(ClientPublicKey, ServerPrivateKey)
。
由于椭圆曲线的数学特性,双方计算出的 SharedSecret
是相同的。
4. 生成会话密钥
客户端和服务器使用以下信息生成会话密钥(Master Secret 和对称加密密钥):
ClientRandom
(客户端随机数)。ServerRandom
(服务器随机数)。Pre-Master Secret
(通过密钥交换算法协商出的共享密钥)。
通过伪随机函数(PRF,Pseudo-Random Function),生成以下密钥:
-
加密密钥:用于对称加密(如 AES)。
-
MAC 密钥:用于消息完整性校验(如 HMAC)。
-
IV:用于分组加密模式(如 AES-GCM)。
MasterSecret = PRF(Pre-MasterSecret, "master secret", ClientRandom + ServerRandom)
SessionKeys = PRF(MasterSecret, "key expansion", ClientRandom + ServerRandom)
5. 完成握手
客户端和服务器交换 Finished
消息,验证握手过程是否成功:
-
客户端发送
Finished
消息,包含握手消息的哈希值(使用会话密钥加密)。 -
服务器验证客户端的
Finished
消息。 -
服务器发送自己的
Finished
消息,客户端验证。Client -> Server: Finished
Encrypted Hash: HMAC(SessionKeys, HandshakeMessages)Server -> Client: Finished
Encrypted Hash: HMAC(SessionKeys, HandshakeMessages)
6. 应用层数据传输
握手完成后,客户端和服务器使用协商出的会话密钥进行对称加密通信。
Client <-> Server: Encrypted Application Data
关键加密算法和细节
步骤 | 加密算法/技术 | 描述 |
---|---|---|
密钥交换 | ECDHE(Elliptic Curve Diffie-Hellman) | 使用椭圆曲线密码学生成共享密钥,提供前向安全性(Forward Secrecy)。 |
身份认证 | RSA 或 ECDSA | 服务器证书中的公钥用于验证服务器身份。 |
对称加密 | AES-128-GCM | 使用 AES 加密算法保护应用层数据,GCM 提供加密和完整性保护。 |
哈希函数 | SHA-256 | 用于生成消息摘要和伪随机函数(PRF)。 |
消息完整性 | HMAC | 使用 HMAC 算法验证消息完整性。 |
总结
HTTPS 密钥交换的核心是通过非对称加密(如 ECDHE)协商共享密钥,并使用对称加密(如 AES)保护实际数据传输。整个过程涉及多个加密算法和技术,确保了通信的机密性、完整性和身份认证。