《加密通信合规测试技巧实战课程》
第3章 TLS/SSL协议详解
3. TLS/SSL 协议详解:TLS 握手过程、密码套件协商、证书链验证机制
本节深入剖析 TLS/SSL 协议的核心运作机制。我们将从一次完整的 TLS 握手开始,逐步拆解密码套件协商的细节,并详细阐述证书链验证如何确保通信双方的身份可信。理解这些底层原理,是进行加密通信合规测试的基础。
3.1 TLS 握手过程
TLS 握手是客户端与服务器在传输应用数据前,建立安全连接的一系列步骤。它负责协商加密算法、交换密钥并验证身份。以下是一个典型的 TLS 1.2 完整握手流程(使用 RSA 密钥交换):
图 3-1:TLS 1.2 完整握手流程(RSA 密钥交换)
握手过程的关键步骤说明:
- 步骤 1 (ClientHello):客户端发起连接,发送支持的 TLS 版本、密码套件列表及一个客户端随机数。
- 步骤 2 (ServerHello + Certificate):服务器选择双方都支持的密码套件和 TLS 版本,发送服务器随机数、数字证书链(包含公钥),并告知客户端 Hello 阶段结束。
- 步骤 3 (ClientKeyExchange + CCS + Finished):客户端验证证书后,生成预主密钥(Pre-master Secret),用服务器公钥加密发送。随后发送 ChangeCipherSpec 表示后续将加密通信,并发送加密的 Finished 消息(包含之前所有握手消息的摘要)。
- 步骤 4 (ChangeCipherSpec + Finished):服务器解密预主密钥,生成会话密钥。同样发送 ChangeCipherSpec 和加密的 Finished 消息进行确认。
- 步骤 5 (应用数据):握手完成,双方使用协商好的对称密钥加密应用数据。
3.2 密码套件协商
密码套件(Cipher Suite)是一组加密算法的组合,决定了安全连接如何实现机密性、完整性和身份验证。协商过程发生在 ClientHello 和 ServerHello 阶段。
一个典型的密码套件名称格式如下:
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
│ │ │ │ │
│ │ │ │ └── 消息认证码 (MAC) 算法
│ │ │ └──────────── 对称加密算法 (密钥长度、模式)
│ │ └──────────────────── 身份验证/签名算法
│ └──────────────────────────── 密钥交换算法
└───────────────────────────────── 协议前缀
下表列出了常见的密码套件及其安全特性:
| 密码套件 | 密钥交换 | 身份验证 | 加密 | MAC/AEAD | 安全等级 |
|---|---|---|---|---|---|
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | ECDHE | RSA | AES-256-GCM | AEAD (GCM) | 高 |
| TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | ECDHE | ECDSA | AES-128-GCM | AEAD (GCM) | 高 |
| TLS_RSA_WITH_AES_256_CBC_SHA256 | RSA | RSA | AES-256-CBC | HMAC-SHA256 | 中 (无前向安全) |
| TLS_RSA_WITH_3DES_EDE_CBC_SHA | RSA | RSA | 3DES-CBC | HMAC-SHA1 | 低 (已弃用) |
协商过程要点:
- 客户端在 ClientHello 中按优先级列出支持的密码套件。
- 服务器从列表中选取第一个它也支持的套件(通常按服务器配置的优先级)。
- 如果服务器不支持任何客户端列出的套件,握手将失败并返回握手失败警报。
- 合规测试中,应检查是否支持弱密码套件(如 RC4、3DES、CBC 模式)以及是否强制使用前向安全(ECDHE/DHE)。
3.3 证书链验证机制
证书链验证是 TLS 握手中最关键的身份认证环节。客户端必须确保服务器提供的证书是由受信任的证书颁发机构(CA)签发的,并且证书是有效的。
图 3-2:证书链验证机制(信任锚为根 CA)
证书链验证的详细步骤:
- 构建证书链:服务器发送其证书以及中间 CA 证书(通常不发送根证书,因为客户端已内置信任的根证书列表)。
- 基本验证:
- 检查每个证书的有效期(notBefore 和 notAfter)。
- 检查证书是否被吊销(通过 CRL 或 OCSP)。
- 检查证书用途(Key Usage、Extended Key Usage)是否匹配(如服务器身份验证)。
- 签名验证:从叶子证书开始,使用签发者(Issuer)的公钥验证该证书的数字签名。重复此过程直到根证书。
- 信任锚验证:链的顶端必须是一个客户端信任的根 CA 证书(通常预装在操作系统或浏览器中)。
- 主机名验证:客户端检查服务器证书的 Subject Alternative Name (SAN) 或 Common Name (CN) 是否与访问的主机名匹配。
合规测试要点:
- 检查证书链是否完整(是否缺少中间证书)。
- 验证是否使用了弱签名算法(如 SHA-1 签名的证书应被拒绝)。
- 确认证书是否过期或已被吊销。
- 测试主机名不匹配时的行为(应拒绝连接)。
- 检查是否允许自签名证书(生产环境应禁止)。
理解 TLS 握手的这三个核心机制,是进行加密通信合规测试的基石。在实际测试中,我们常使用 Wireshark、openssl s_client 或专门的 TLS 扫描器(如 testssl.sh)来观察和验证这些过程是否符合安全规范。