配置国密HTTPS通信,关键在于根据你的安全需求和兼容性目标,在TLCP和国密TLS 1.3这两个主流协议族中做出选择,并配置对应的密码套件。
一、核心选择:TLCP vs. 国密TLS 1.3
目前主流的国密SSL/TLS协议有两个方向,它们在证书体系、安全性和兼容性上存在显著差异。
特性 TLCP (GB/T 38636-2020) 国密TLS 1.3 (RFC 8998)
协议基础 基于TLS 1.1改编的国标协议 国际标准TLS 1.3的国密扩展
证书机制 双证书(签名证书 + 加密证书) 单证书(通常为签名证书)
核心密码套件 `ECDHE-SM2-SM4-GCM-SM3` (主流)、`SM2-SM4-SM3` 等 `TLS_SM4_GCM_SM3` (0x00C6)、`TLS_SM4_CCM_SM3` (0x00C7)
前向安全性 传统TLCP 不支持 支持,有效防止私钥泄露导致历史数据被解密
兼容性 国内早期国密项目广泛部署 国际标准,但需要较新的客户端支持
简单来说,追求更高安全性(特别是前向安全)和国际化标准,应优先选择国密TLS 1.3;若需兼容现有只支持TLCP的旧系统,则需使用TLCP。
二、配置指南
以下是两大主流方案的配置思路和示例。
方案一:配置国密 TLS 1.3 (推荐)
这是更现代、安全的方案,遵循RFC 8998标准。
核心组件:
协议版本:`TLSv1.3`
密码套件:`TLS_SM4_GCM_SM3` 或 `TLS_SM4_CCM_SM3`
证书:配置国密SM2证书
配置示例 (以Tongsuo/BabaSSL等支持国密的OpenSSL衍生版为例):
服务端:配置SM2证书和私钥即可,与标准TLS 1.3服务端配置类似。
`bash
启动服务端,监听4433端口
openssl s_server -cert /path/to/your/sm2.crt -key /path/to/your/sm2.key -accept 127.0.0.1:4433 -tls1_3
客户端:需要强制指定使用国密密码套件。
bash
连接服务端,并强制使用国密套件
openssl s_client -connect 127.0.0.1:4433 -tls1_3 -ciphersuites TLS_SM4_GCM_SM3
在代码中,可通过`SSL_CTX_set_ciphersuites(ctx, "TLS_SM4_GCM_SM3")`等API进行设置。
注意:RFC 8998标准要求强制使用SM2签名。但一些实现(如Tongsuo)为了兼容性默认未强制开启,可通过`SSL_CTX_enable_sm_tls13_strict(ctx)`等API手动开启。
方案二:配置 TLCP (兼容模式)
适用于需要兼容只支持TLCP协议的旧系统。
核心组件:
协议版本:`TLCP 1.1` (对应 GB/T 38636-2020)
密码套件:`ECDHE-SM2-SM4-GCM-SM3`
证书:配置国密双证书(签名证书 + 加密证书)
配置示例 (以Nginx为例):
需要在支持国密算法的Nginx版本(如打了国密补丁的Nginx)中进行配置。
nginx
server {
listen 443 ssl;
ssl_protocols TLSv1.2; # TLCP常被识别为TLSv1.2
配置双证书
ssl_certificate /path/to/your/sm2_sign.crt; # 签名证书
ssl_certificate_key /path/to/your/sm2_sign.key;
ssl_enc_certificate /path/to/your/sm2_enc.crt; # 加密证书
ssl_enc_certificate_key /path/to/your/sm2_enc.key;
指定国密套件
ssl_ciphers 'ECDHE-SM2-SM4-GCM-SM3';
ssl_prefer_server_ciphers on;
}
三、混合配置与兼容性
在实际部署中,为了同时兼顾安全与兼容,常采用双证书或协议协商模式。
双证书部署:在服务器上同时配置国际算法(RSA/ECC)和国密算法(SM2)两套证书。服务端可根据客户端支持的算法,自动选择使用国际SSL通道还是国密SSL通道。这是目前平滑过渡到国密的常用方案。
协议版本选择:
优先支持TLS 1.3:TLS 1.3默认移除了不安全的算法,强制使用前向保密,安全性更高。
禁用不安全的老版本:建议禁用SSLv2、SSLv3、TLS 1.0和TLS 1.1,以规避已知漏洞。
总结
配置国密HTTPS通信,你可以遵循以下决策路径:
1. 首选国密TLS 1.3:如果可能,优先采用基于RFC 8998的TLS 1.3方案。它提供了更高的安全性(前向安全)和更新的密码套件(`TLS_SM4_GCM_SM3` / `TLS_SM4_CCM_SM3`)。
2. 兼容旧系统则用TLCP:如果需要与仅支持旧国密标准的系统通信,则需配置TLCP协议及对应的双证书和套件(如`ECDHE-SM2-SM4-GCM-SM3`)。
3. 部署双证书实现平滑过渡:为同时服务国际和国密客户端,最佳实践是部署双证书,让服务器自动协商最合适的加密通道。
4. 使用专业国密库:确保你的软件栈(如Nginx、OpenSSL)集成了专业的国密算法库,如Tongsuo(铜锁)、GmSSL或openHiTLS等,这是实现上述配置的基础。