国密 SSL/TLS 客户端认证与双向认证协议详解

协议详解 · 2026-07-02

概述

GM/T 0024-2014《SSL VPN 技术规范》中的第 4 部分定义了国密 SSL/TLS 协议(简称 TLCP,TLS Cipher Protocol),它是中国自主设计的传输层安全协议,专门用于满足国密合规要求。

与 TLS 1.2 类似,TLCP 支持服务器单向认证和客户端双向认证两种模式。但国密双向认证有其独特之处:双证书体系(签名证书 + 加密证书)和国密密钥交换协议(SM2 密钥协商)。

协议基础

TLCP 与 TLS 1.2/1.3 的关系

TLCP 协议在设计上借鉴了 TLS 1.2 的框架,但在关键组件上做了国密化改造:

组件TLS 1.2TLS 1.3TLCP (GM/T 0024)
密钥交换RSA/DHE/ECDHE(EC)DHESM2 密钥协商
身份认证X.509 + RSA/ECDSAX.509 + RSA/ECDSA/EdDSAX.509 + SM2
对称加密AES-128/256AES-128/256SM4
哈希算法SHA-256/384SHA-256/384SM3
伪随机函数PRF(SHA-256)HKDF(SHA-256)HKDF-SM3

双证书体系

国密双向认证的核心特征是双证书体系

为什么需要双证书?

  • 安全隔离:签名密钥和加密密钥分离,即使加密密钥泄露也不影响签名验证
  • 密钥轮换:加密证书可以频繁轮换(如每年更换),签名证书保持稳定
  • 合规要求:密评要求签名和加密使用不同的密钥对

握手流程详解

单向认证流程

TLCP 单向认证(仅服务器认证)的握手流程如下:

双向认证流程

TLCP 双向认证(客户端 + 服务器认证)的握手流程在单向认证基础上增加了客户端认证环节:

消息格式

#### ServerKeyExchange 消息

#### ClientKeyExchange 消息

CODE
struct {
    select (KeyExchangeAlgorithm) {
        case sm2:
            Sm2ClientKeyExchange;
    };
} ClientKeyExchange;

struct {
    uint8 encrypted_pre_master[128];  // 用服务器加密证书公钥加密
} Sm2ClientKeyExchange;

密钥派生

TLCP 使用 HKDF-SM3 进行密钥派生,与 TLS 1.3 的 HKDF-SHA256 类似:

CODE
pre_master_secret = SM2_Encrypt(encrypted_cert_public_key, random_bytes)
master_secret = HKDF-SM3(pre_master_secret, ClientRandom || ServerRandom)
key_block = master_secret + PRF(master_secret, "key expansion", random_bytes)

密钥派生链

CODE
pre_master_secret (SM2 加密得到)
    ↓
master_secret (HKDF-SM3)
    ↓
key_block (扩展密钥材料)
    ├── client_write_MAC_key (SM3 HMAC 密钥)
    ├── server_write_MAC_key
    ├── client_write_key (SM4 密钥)
    ├── server_write_key
    ├── client_write_IV (SM4-CBC 初始向量)
    └── server_write_IV

客户端证书验证

验证流程

服务器验证客户端证书的流程:

签名验证要点

TLCP 中客户端和服务器的 CertificateVerify 消息包含对握手消息的 SM2 签名。验证时需要:

  • 收集所有握手消息的哈希(ClientHello 到 CertificateVerify 之前)
  • 使用 SM3 计算握手消息摘要
  • 用客户端签名证书的公钥验证 SM2 签名

安全属性分析

前向安全性

TLCP 支持前向安全性(Forward Secrecy),前提是使用 SM2 ephemeral 密钥交换:

密钥交换模式前向安全说明
SM2 静态密钥交换服务器加密证书私钥泄露后可解密历史会话
SM2 临时密钥交换 (Ephemeral)每次会话生成新的临时密钥对
SM2 静态 + SM4 会话密钥同上
TLCP 的最佳实践:使用 SM2 临时密钥交换(类似 ECDHE),确保前向安全性。

中间人攻击防护

TLCP 通过以下方式防止中间人攻击:

  • 双证书体系:签名证书用于身份认证,加密证书用于密钥交换,分离攻击面
  • CertificateVerify:双方都用签名证书对握手消息签名,确保握手完整性
  • 密钥确认:Finished 消息验证密钥一致性

已知安全分析

  • SM2 密钥交换协议缺陷:TLCP 的 SM2 密钥交换协议(GM/T 0018.3)在实现中存在一些已知问题,主要体现在:
- 密钥确认机制不完善 - 不支持前向安全的默认配置 - 部分实现中 SM2 Z 值计算不一致

  • 与 TLS 1.3 对比:TLCP 保留了 TLS 1.2 的灵活握手,但也继承了其复杂性。TLS 1.3 通过简化握手步骤和强制前向安全性解决了部分问题。

与 TLS 1.2/1.3 客户端认证的对比

认证机制对比

特性TLS 1.2TLS 1.3TLCP (GM/T 0024)
客户端认证支持
认证算法RSA/ECDSA/EdDSAECDSA/EdDSASM2
证书格式X.509X.509X.509 + 双证书
密钥交换RSA/DHE/ECDHE(EC)DHESM2 密钥协商
前向安全可选强制可选(需配置)
握手轮次2 RTT1 RTT (0-RTT 可选)2 RTT
签名算法SHA-256/384SHA-256/384/256SM3

实现复杂度对比

相关实践

参考来源

  • GM/T 0024-2014《SSL VPN 技术规范 第4部分:国密SSL协议》: https://www.oscca.gov.cn/
  • GM/T 0018.3-2010《密码模块安全技术要求 第3部分:密钥交换协议》: https://www.oscca.gov.cn/
  • RFC 5246 TLS 1.2 Protocol: https://datatracker.ietf.org/doc/html/rfc5246
  • RFC 8446 TLS 1.3 Protocol: https://datatracker.ietf.org/doc/html/rfc8446
  • RFC 8998 TLS 1.3 with GCM/CCM Cipher Suites: https://datatracker.ietf.org/doc/html/rfc8998
  • 国密 SSL/TLS 协议白皮书: https://www.oscca.gov.cn/