SSL/TLS 握手过程是客户端和服务器之间建立安全连接的过程
主要包括以下步骤
-
客户端Hello (Client Hello)
- 客户端发送支持的SSL/TLS版本、加密套件(cipher suites)、压缩方法和一个随机数(client random)给服务器。
-
服务器Hello (Server Hello)
- 服务器从客户端支持的加密套件中选择一个加密套件,并返回给客户端,同时发送服务器的随机数(server random)。
-
服务器证书 (Server Certificate)
- 服务器发送包含其公钥的数字证书给客户端。客户端使用这个证书来验证服务器的身份。
-
服务器Hello完成 (Server Hello Done)
- 服务器向客户端发送一个消息,表示服务器端的Hello消息已完成。
-
客户端密钥交换 (Client Key Exchange)
- 客户端生成一个预主密钥(pre-master secret),并使用服务器的公钥对其进行加密,然后发送给服务器。服务器使用其私钥解密预主密钥。
-
生成对称密钥 (Generate Symmetric Keys)
- 客户端和服务器根据预主密钥、客户端随机数和服务器随机数生成对称密钥,用于后续的数据加密传输。
-
客户端完成 (Client Finished)
- 客户端发送一个加密的“完成”消息,表示握手过程已完成。这条消息使用生成的对称密钥进行加密。
-
服务器完成 (Server Finished)
- 服务器也发送一个加密的“完成”消息,表示握手过程已完成。这条消息同样使用生成的对称密钥进行加密。
SSL/TLS 握手过程的流程图
以下是SSL/TLS握手过程的详细流程图:
+-----------------------------------------------+
| 客户端 |
+-----------------------------------------------+
|
| Client Hello
| (支持的版本,加密套件,随机数)
v
+-----------------------------------------------+
| 服务器 |
+-----------------------------------------------+
^
| Server Hello
| (选择的版本,加密套件,随机数)
|
| Server Certificate
| (服务器公钥证书)
|
| Server Hello Done
v
+-----------------------------------------------+
| 客户端 |
+-----------------------------------------------+
^
| Client Key Exchange
| (用服务器公钥加密的预主密钥)
|
| [生成对称密钥]
| Client Finished
| (用对称密钥加密的完成消息)
v
+-----------------------------------------------+
| 服务器 |
+-----------------------------------------------+
^
| [解密预主密钥并生成对称密钥]
| Server Finished
| (用对称密钥加密的完成消息)
v
+-----------------------------------------------+
| 客户端 |
+-----------------------------------------------+
[对称加密的数据传输开始]
在这个流程图中,握手过程的各个步骤依次进行,最终在客户端和服务器之间建立一个安全的加密通道,用于后续的数据传输。
对数字证书要有基本的理解
数字证书是一个电子文档,用于证明实体(如服务器、个人或组织)的身份。在SSL/TLS握手过程中,服务器使用数字证书来向客户端证明其身份,并提供其公钥,以便客户端加密敏感信息。
数字证书的内容
-
主体信息(Subject Information)
- 包括持有证书的实体的信息,如组织名称、部门名称、国家、电子邮件地址等。
-
公钥(Public Key)
- 证书持有者的公钥,用于加密数据或验证签名。在SSL/TLS握手过程中,客户端使用这个公钥加密预主密钥(pre-master secret)。
-
签发者信息(Issuer Information)
- 签发证书的证书颁发机构(CA)的信息。
-
有效期(Validity Period)
- 证书的有效期,包括开始日期和结束日期。
-
证书序列号(Certificate Serial Number)
- 证书的唯一标识符。
-
证书使用范围(Key Usage)
- 指定证书可以用于哪些目的(如数字签名、数据加密等)。
-
扩展信息(Extensions)
- 其他附加信息,如证书策略、CRL(证书吊销列表)分发点等。
-
签名(Signature)
- 证书颁发机构对证书内容的数字签名,用于验证证书的完整性和真实性。
数字证书的作用
-
身份验证
- 客户端可以通过验证数字证书的签发者和签名,确保证书的真实性,从而确认服务器的身份。
-
公钥分发
- 数字证书中包含服务器的公钥,客户端可以使用这个公钥加密敏感数据(如预主密钥),确保传输过程中的数据安全。
数字证书的结构
一个标准的X.509数字证书结构如下:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 123456789 (0x75bcd15)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
Validity
Not Before: Jan 1 00:00:00 2024 GMT
Not After : Jan 1 00:00:00 2025 GMT
Subject: CN=example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:af:8c:45:3b:e2:ad:e2:29:ab:ee:6f:12:3f:ad:
59:e2:31:92:e3:ef:dd:7b:58:e2:ab:cb:13:57:aa:
...
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
a3:9e:87:29:23:32:cd:50:30:b7:0b:69:ba:c7:3b:17:cd:18:
62:aa:72:bd:e6:df:67:1c:2e:72:e6:df:14:39:b2:cd:22:75:
...
详细的握手过程示例
为了更好地理解数字证书在SSL/TLS握手过程中的作用,以下是一个详细的示例:
-
客户端Hello
- 客户端发送支持的SSL/TLS版本、加密套件和一个随机数给服务器。
-
服务器Hello
- 服务器选择加密套件,发送服务器的随机数和服务器的数字证书给客户端。
-
验证服务器证书
- 客户端使用预先安装的CA公钥验证服务器证书的签名,确保证书未被篡改。
- 检查证书的有效期和颁发者,确保证书有效且可信。
-
生成预主密钥
- 客户端生成一个预主密钥,用服务器的公钥加密后发送给服务器。
- 服务器使用其私钥解密预主密钥。
-
生成对称密钥
- 客户端和服务器使用预主密钥、客户端随机数和服务器随机数生成会话密钥,用于加密后续通信。
通过这个过程,客户端和服务器之间建立了一个安全的加密通道,确保数据传输的保密性和完整性。