要让Nginx支持国密双证书体系,必须替换为GmSSL等国密增强密码库并重新编译,配置中需分别指定签名与加密的SM2证书及私钥,启用TLSv1.1和国密套件,并可叠加RSA配置实现双栈共存。

要让 Nginx 支持国密算法的双证书体系(SM2 签名 + SM2 加密),核心不是简单改配置,而是替换底层密码库、重新编译 Nginx,并正确组织两套 SM2 证书。国密 TLS(即 TLCP 协议)强制要求签名和加密功能分离,这与传统 RSA 单证书完全不同。
必须使用支持国密的密码库
官方 OpenSSL 不支持 SM2/SM3/SM4,所以不能直接用 apt/yum 安装的 nginx + openssl。你必须选用以下任一国密增强版密码库:
- GmSSL:开源活跃,GitHub 持续更新,推荐用于新部署(v3.x 起使用 CMake 构建)
- Tongsuo(铜锁):蚂蚁集团维护,金融级稳定,兼容性好,适合生产环境
- Wosign 国密模块(如 gmssl_openssl_*.tar.gz):沃通提供,常用于阿里云等云平台集成
编译时需指定 --with-openssl=/path/to/gmssl,并确保头文件路径(-I/usr/local/gmssl/include)和链接库路径(-L/usr/local/gmssl/lib)准确无误。
准备两套 SM2 证书文件
国密双证书不是“一个证书两个用途”,而是物理上独立的两对 PEM 文件:
-
签名证书链:
server_sign.crt(含根+中间 CA)、server_sign.key(对应私钥) -
加密证书链:
server_enc.crt(含根+中间 CA)、server_enc.key(对应私钥)
注意:两套私钥必须由不同密钥对生成,不可复用;证书申请时需明确选择“国密双证书”类型,否则只下发一套。
Nginx 配置启用双证书与 TLCP
在 server 块中添加如下配置(以 GmSSL 编译的 Nginx 为例):
ssl_certificate /path/to/server_sign.crt; ssl_certificate_key /path/to/server_sign.key; <p>ssl_certificate_enc /path/to/server_enc.crt; ssl_certificate_key_enc /path/to/server_enc.key;</p><p>ssl_protocols TLSv1.1; # TLCP 对应 TLS 1.1,非 TLS 1.2/1.3 ssl_ciphers ECC-SM4-SM3:ECDHE-SM4-SM3; # 仅启用国密套件 ssl_prefer_server_ciphers on;</p>
关键点:ssl_certificate_enc 和 ssl_certificate_key_enc 是国密版 Nginx 特有的指令,原生 Nginx 不识别;ssl_protocols TLSv1.1 是 TLCP 协议的硬性要求,设为 TLSv1.2 将导致国密握手失败。
实现国密/RSA 双栈共存(推荐生产方案)
纯国密站点只能被密信、红莲花等国密浏览器访问,实际项目几乎都采用双栈模式:
- 保留原有 RSA/ECC 证书配置(
ssl_certificate+ssl_certificate_key) - 叠加国密双证书配置(
ssl_certificate_enc+ssl_certificate_key_enc) - 在
ssl_ciphers中同时列出国际套件与国密套件,例如:ECC-SM4-SM3:ECDHE-SM4-SM3:EECDH+AESGCM:EDH+AESGCM
客户端会根据自身能力自动协商:国密浏览器走 TLCP 握手,Chrome/Firefox 走标准 TLS,无需额外路由或端口区分。











