国密SSL/TLS双证书自适应方案详解
概述
国密SSL/TLS双证书自适应方案是一种在企业级HTTPS部署中广泛采用的混合架构,旨在同时满足国密合规要求和国际浏览器兼容性。该方案通过在同一服务器上配置两套不同的数字证书(国际证书用于RSA/ECC算法,国密证书用于SM2算法),根据客户端的能力自动协商并切换至合适的密码套件。
随着《网络安全法》修订版(2026年1月1日实施)和《关键信息基础设施安全保护条例》的深入推进,政务、金融、能源等关键行业对国密算法的应用要求日益严格。然而,Chrome、Safari、Firefox等国际主流浏览器默认不支持国密SSL/TLS协议(TLS_GM),导致单一国密证书无法满足所有用户的访问需求。双证书自适应方案由此成为平衡合规与兼容性的主流选择。
方案设计背景
1. 合规与兼容的双重压力
国密改造面临的核心矛盾是:
| 维度 | 国密证书(SM2) | 国际证书(RSA/ECC) |
|---|---|---|
| 合规性 | ✅ 满足密评要求 | ❌ 不满足国密要求 |
| 浏览器支持 | 需国密浏览器插件 | ✅ 全平台原生支持 |
| 移动端支持 | 受限(需安装国密App) | ✅ iOS/Android原生支持 |
| 性能 | SM2签名/验签略快于RSA 2048 | RSA 2048性能成熟 |
| 证书颁发 | 国密CA(如CFCA、BJCA) | 国际CA(如DigiCert、Let's Encrypt) |
2. 双证书方案的演进
双证书方案经历了三个发展阶段:
第一阶段:端口分离(早期方案)
- 国密HTTPS使用443端口(国际)+ 8443端口(国密)
- 缺点:用户需手动输入不同端口,体验差
- 443端口同时配置国际证书和国密证书
- 通过TLS握手阶段的ClientHello扩展协商决定使用哪套证书
- 优点:用户无感知,URL不变
- 结合CDN/边缘网关的智能路由
- 根据客户端指纹、UA字符串、IP地域等信息预判
- 提前下发对应证书,减少握手往返
双证书自适应工作原理
1. TLS握手协商流程
客户端 服务器
| |
|--- ClientHello ------------->|
| (包含supported_groups, |
| signature_algorithms, |
| key_share扩展) |
| |
| 检测客户端能力: |
| - 是否支持TLS_GM扩展? |
| - 是否支持SM2签名算法? |
| - Client UA是否为国密浏览器?|
| |
|<-- ServerHello -------------|
| (选择密码套件): |
| - 国密: TLS_SM4_GCM_SM3 |
| - 国际: TLS_AES_256_GCM_SHA384 |
| (返回对应证书): |
| - 国密: SM2服务器证书 |
| - 国际: RSA/ECC服务器证书 |
| |
|--- Certificate ------------>|
|--- ServerKeyExchange ------>|
|--- CertificateRequest ----->| (可选,双向认证)
|--- ServerHelloDone -------->|
| |
|--- ClientKeyExchange ------->|
|--- CertificateVerify ------>| (如有客户端证书)
|--- Finished --------------->|
| |
|<-- Finished ----------------|
| |
[TLS连接建立,使用协商的密码套件]2. 关键协商机制
#### 2.1 密码套件协商
TLS 1.2环境下,客户端通过CipherSuites扩展列出支持的密码套件。国密TLS扩展定义了以下密码套件标识符:
| 密码套件 | 密钥交换 | 认证 | 对称加密 | MAC/哈希 |
|---|---|---|---|---|
TLS_SM4_GCM_SM3 | SM2 | SM2 | SM4-GCM | SM3 |
TLS_SM4_CCM_SM3 | SM2 | SM2 | SM4-CCM | SM3 |
TLS_SM4_CBC_SM3 | SM2 | SM2 | SM4-CBC | SM3-HMAC |
| 密码套件 | 密钥交换 | 认证 | 对称加密 | MAC/哈希 |
|---|---|---|---|---|
TLS_AES_256_GCM_SHA384 | ECDHE | ECDSA/RSA | AES-256-GCM | SHA-384 |
TLS_CHACHA20_POLY1305_SHA256 | ECDHE | ECDSA/RSA | ChaCha20-Poly1305 | SHA-256 |
客户端在signature_algorithms扩展中声明支持的签名算法。国密浏览器会在该扩展中包含:
sm2sig-sm3(SM2签名 + SM3哈希)ecdsa_secp256r1_sha256(兼容国际)rsa_pss_rsae_sha256(兼容国际)
sm2sig-sm3,仅包含国际签名算法。#### 2.3 扩展协商
国密TLS在标准TLS扩展基础上增加了两个关键扩展:
- TLS_GM扩展(IANA注册为
0xFF01):标识客户端支持国密TLS协议 - sm2_certs_type扩展:声明客户端可接受的国密证书类型(服务器证书、签名证书、加密证书)
3. 服务端智能协商逻辑
Nginx等Web服务器通过以下逻辑判断使用哪套证书:
IF 客户端ClientHello包含 TLS_GM扩展 (0xFF01)
AND 签名算法列表包含 sm2sig-sm3
THEN 使用国密SM2证书 + 国密密码套件
ELSE IF 客户端支持ECDHE + AES-GCM
THEN 使用国际RSA/ECC证书 + AES-GCM密码套件
ELSE 降级使用RSA 2048 + CBC密码套件(兼容旧客户端)部署架构
1. Nginx双证书配置
环境要求:Nginx需编译国密模块(Tongsuo/GmSSL/BabaSSL),标准OpenSSL不支持国密密码套件。
# ⚠️ 环境要求:需编译Tongsuo或BabaSSL国密版Nginx
server {
listen 443 ssl;
server_name example.com;
# --- 国际证书(默认,兼容所有浏览器)---
ssl_certificate /etc/nginx/ssl/intl-cert.pem;
ssl_certificate_key /etc/nginx/ssl/intl-key.pem;
# --- 国密证书(国密浏览器自动协商)---
# Tongsuo/Nginx国密版通过ssl_gmtls指令启用
ssl_gmtls_certificate /etc/nginx/ssl/gm-cert.pem;
ssl_gmtls_certificate_key /etc/nginx/ssl/gm-key.pem;
# --- 国际密码套件(从高到低排序)---
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
# --- 国密密码套件 ---
ssl_gmtls_ciphers TLS_SM4_GCM_SM3;
ssl_gmtls_prefer_server_ciphers on;
# --- 椭圆曲线 ---
ssl_ecdh_curve secp256r1:x25519;
# 国密SM2曲线由gmssl库内置定义
# --- 会话缓存 ---
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# --- HSTS ---
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://backend;
}
}2. 负载均衡器方案
#### HAProxy双证书配置
# ⚠️ 环境要求:需编译Tongsuo版HAProxy
# 标准HAProxy不支持国密TLS
global
ssl-default-bind-options no-sslv3 tlsv12
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
frontend gm_https
bind *:443 ssl crt /etc/haproxy/certs/
bind *:443 ssl crt /etc/haproxy/certs/gm.pem alpn h2,http/1.1 gmtls
# 国密证书优先匹配
acl is_gm_browser ssl_ocsp_mbu -m str 1
use_backend gm_servers if is_gm_browser
default_backend intl_servers
backend gm_servers
server gm1 10.0.1.10:443 check ssl verify none
server gm2 10.0.1.11:443 check ssl verify none
backend intl_servers
server intl1 10.0.2.10:443 check ssl verify none
server intl2 10.0.2.11:443 check ssl verify none#### 七层代理方案(CDN/边缘网关)
对于大型互联网企业,通常在CDN或边缘网关层实现双证书自适应:
客户端 → CDN边缘节点 → 源站
│
┌────┴────┐
│ 智能路由 │
└────┬────┘
┌──────┴──────┐
▼ ▼
国密证书路径 国际证书路径
(SM2+SM4+SM3) (RSA+AES+SHA)
│ │
└──────┬──────┘
▼
后端应用服务器CDN边缘节点的协商逻辑:
- 根据ClientHello中的扩展判断客户端类型
- 对国密浏览器(360安全浏览器、奇安信可信浏览器、零信浏览器、红莲花浏览器等)返回国密证书
- 对国际浏览器(Chrome、Firefox、Safari、Edge)返回国际证书
- 对未知客户端,默认返回国际证书以保证最大兼容性
3. 双证书体系
国密SM2证书通常采用双证书体系(签名证书 + 加密证书),这是GM/T 0015-2023《信息技术 应用密码技术 证书格式规范》的要求:
| 证书类型 | 用途 | 密钥用途 |
|---|---|---|
| 签名证书 | TLS握手中的ServerKeyExchange签名 | DigitalSignature |
| 加密证书 | 密钥交换中的SM2加密 | KeyEncipherment |
- 密钥分离:签名密钥和加密密钥独立管理,密钥泄露不影响加密证书的保密性,符合 GM/T 0015-2023 的密钥分离。
4. 证书管理体系
国密双证书体系需要配套的管理流程:
- 签名证书管理:签名证书用于身份认证和数字签名,需定期轮换(建议每年一次)
- 加密证书管理:加密证书用于密钥封装,密钥泄露不影响历史通信的保密性
- CA 证书链:国密 CA 证书需遵循 GM/T 0034-2014《Web 服务器证书技术规范》建立完整的信任链
- CRL/OCSP:双证书体系下需分别维护签名证书和加密证书的吊销列表
客户端适配
国密浏览器支持情况
| 浏览器 | 国密支持 | 备注 |
|---|---|---|
| 360 安全浏览器 | ✅ 原生支持 | 国内用户量最大的国密浏览器 |
| 奇安信可信浏览器 | ✅ 原生支持 | 政务场景常用 |
| 零信浏览器 | ✅ 原生支持 | 基于 Chromium 的国密浏览器 |
| 红莲花浏览器 | ✅ 原生支持 | 军工领域专用 |
| 百度浏览器 | ✅ 插件支持 | 需安装国密插件 |
| Chrome | ❌ 不支持 | 需使用国密浏览器 |
| Firefox | ❌ 不支持 | 需使用国密浏览器 |
| Safari | ❌ 不支持 | 需使用国密浏览器 |
| Edge | ❌ 不支持 | 需使用国密浏览器 |
移动端适配
移动端国密支持相对滞后,主要方案包括:
- 国密 App:在 App 内嵌国密 TLS 库(如 Tongsuo),实现国密 HTTPS
- WebView 注入:通过自定义 WebView 注入国密 SSL 上下文
- H5 降级:对非国密客户端降级为国际 TLS,后端统一处理
性能考量
握手性能对比
| 场景 | RSA-2048 握手 | SM2 握手 | 性能差异 |
|---|---|---|---|
| 首次握手 | ~50ms | ~30ms | SM2 更快 |
| 会话恢复 | ~5ms | ~5ms | 基本相同 |
| 全握手(ECDHE) | ~80ms | ~60ms | SM2+ECDHE 更快 |
计算资源消耗
| 操作 | CPU 占用 | 内存占用 |
|---|---|---|
| SM2 签名 | ~2% | ~1MB |
| SM2 验签 | ~1% | ~512KB |
| SM2 加密 | ~3% | ~1MB |
| SM2 解密 | ~2% | ~512KB |
| SM4-GCM 加密 | ~0.5%(硬件加速) | ~256KB |
常见问题
Q1: 双证书方案能否只用一套证书?
可以,但不符合 GM/T 0015-2023 的最佳实践。单证书方案在签名密钥泄露时会同时暴露加密密钥的风险,双证书通过密钥分离降低了整体风险。
Q2: 国密 TLS 是否支持前向保密(PFS)?
支持。国密 TLS 使用 SM2+SM4 结合 ECDHE 密钥协商时,可实现前向保密。但需注意:标准国密密码套件 TLS_SM4_GCM_SM3 使用的是静态 SM2 密钥交换,不支持 PFS。如需 PFS,需使用支持 ECDHE 的国密密码套件扩展。
Q3: 如何平滑迁移到国密?
- 第一阶段:部署双证书方案,国密浏览器走国密通道,国际浏览器走国际通道
- 第二阶段:逐步替换后端应用的国际密码库为国密实现
- 第三阶段:推动客户端升级,扩大国密浏览器覆盖范围
- 第四阶段:在合规要求的场景中强制使用国密算法
总结
国密 SSL/TLS 双证书自适应方案是当前平衡合规与兼容性的最优解。通过 TLS 握手阶段的智能协商,同一服务器可以同时服务于国密浏览器和国际浏览器,无需改变客户端 URL。
随着《网络安全法》合规要求的深化和国密浏览器的普及,双证书方案的过渡期价值将逐渐降低,但在可预见的未来,它仍将是政企系统国密改造的主流选择。
参考来源
- GM/T 0015-2023《信息技术 应用密码技术 证书格式规范》
- GM/T 0024-2014《SL/T 0024-2014 密码协议检验 第1部分:SSL/TLS 协议》
- GM/T 0082-2021《信息安全技术 SSL/TLS 基本协议技术要求》
- 《GM/T 0054-2018 信息系统密码应用基本要求》
- DMTF: Confidential Computing Interoperability Specification (CCIS)
- SNIA: Cloud Data Storage Architecture (CDSA)
- RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
- 国家密码管理局: 商用密码应用安全性评估管理办法