国密“双证书”指SM2体系内分工明确的签名证书(server_sign.crt)与加密证书(server_enc.crt),分别用于身份认证/数字签名和密钥交换,须使用独立生成的SM2密钥对,不可混用私钥。

明确双证书的国密含义
国密“双证书”不是指国际RSA和SM2各配一套,而是SM2体系内分工明确的两套:一张签名证书(server_sign.crt)用于身份认证和数字签名,一张加密证书(server_enc.crt)专用于密钥交换。两者必须使用独立生成的SM2密钥对,不可混用私钥。
编译支持国密的 Nginx
原生 Nginx 完全不识别 SM2/SM3/SM4。你必须使用国密增强 OpenSSL(如 Tongsuo 或 GMSSL)重新编译:
- 下载并安装 Tongsuo(推荐)或 GMSSL,验证命令:
tongsuo version应显示 sm2/sm3/sm4 支持 - 编译 Nginx 时显式指定路径:
--with-openssl=/path/to/tongsuo - 确认生效:
nginx -V 2>&1 | grep openssl输出应指向你安装的国密库,而非系统默认 OpenSSL
Nginx 配置双证书核心指令
在同一个 server 块中添加以下配置(注意指令名带 _enc 后缀是国密版特有):
-
ssl_certificate /path/to/server_sign.crt;—— SM2 签名证书(含公钥) -
ssl_certificate_key /path/to/server_sign.key;—— 对应签名私钥 -
ssl_certificate_enc /path/to/server_enc.crt;—— SM2 加密证书(仅用于密钥交换) -
ssl_certificate_key_enc /path/to/server_enc.key;—— 对应加密私钥 -
ssl_protocols TLSv1.1;—— TLCP 协议强制要求,设为 TLSv1.2 或更高将导致国密握手失败 -
ssl_ciphers ECC-SM4-SM3:ECDHE-SM4-SM3;—— 仅启用国密套件,确保纯国密链路 -
ssl_prefer_server_ciphers on;—— 服务端主导协商,避免客户端干扰
兼容国际客户端需另配单栈模式
若要同一域名同时服务国密浏览器(如红莲花)和 Chrome/Firefox,不能靠双证书指令实现自动分流。正确做法是:
- 放弃
ssl_certificate_enc指令,改用单证书+多套件协商模式 - 只配置
ssl_certificate(SM2 全链证书)和ssl_certificate_key(SM2 私钥) - 启用混合套件:
ssl_ciphers "TLS_SM4_SM3:ECDHE-SM4-SM3:ECDHE-ECDSA-AES128-GCM-SHA256"; - 协议保留
TLSv1.2 TLSv1.3,供国际客户端回退 - 依赖客户端在 ClientHello 中声明支持的套件,由服务端匹配选择











