需使用国密版OpenSSL 3.0+或GMSSL、国密定制Nginx源码编译,并配置SM2双证书及专用套件ECDHE-SM4-CBC-SM3等,方能实现Nginx国密HTTPS服务。

要让 Nginx 支持国密算法(SM2/SM3/SM4)并提供 HTTPS 服务,不能直接使用官方版 Nginx + OpenSSL,必须替换为支持国密的软件栈,并完成证书、配置与验证全流程。核心在于“国密版 OpenSSL + 国密定制版 Nginx + SM2双证书或单证书部署”三者协同。
确认环境是否满足国密基础要求
国密 HTTPS 不是简单改几行配置就能启用的功能,它对底层组件有明确版本依赖:
- OpenSSL 必须为 3.0+(主干已内置 SM2/SM3/SM4)或使用 GMSSL 定制版(如 gmssl_openssl_b2025.xxxx);旧版 OpenSSL 1.1.x 需打补丁,不推荐。
- Nginx 推荐 1.25.x 或 1.24.x,需从源码编译,且 configure 时必须指定 --with-openssl=/path/to/gmssl,否则无法识别 SM2 密钥和套件。
- 运行命令验证:
openssl version应输出OpenSSL 3.0.x或GMSSL x.x.x;nginx -V 2>&1 | grep -i openssl应显示你指定的国密 OpenSSL 路径。
准备 SM2 证书与私钥文件
国密证书不是单一文件,通常分签名证书(用于身份认证和签名)与加密证书(用于密钥交换),部分厂商也提供合并后的单证书方案:
- 从阿里云、CFCA、DNSPod 等支持国密的 CA 申请 SM2 证书,下载后解压得到:
example.com_sm2_sign.pem(签名证书)、example.com_sm2_sign.key(签名私钥)、example.com_sm2_enc.pem(加密证书)、example.com_sm2_enc.key(加密私钥)。 - 若仅用单证书模式(如部分云厂商提供的“SM2 一体证书”),则只需
sm2_cert.pem和sm2_key.pem两个文件,但需确认该证书同时包含签名与加密用途(X.509 扩展中应含Key Usage: digitalSignature, keyEncipherment)。 - 私钥务必保持安全,禁止 chmod 755;建议设为
600,且路径不在 Web 可访问目录下。
修改 Nginx 配置启用国密 TLS
在 server 块中添加或更新以下关键指令,注意国密专用参数不可照搬国际标准配置:
-
listen 443 ssl http2;—— 启用 HTTPS 与 HTTP/2(国密环境推荐开启) -
ssl_certificate /path/to/example.com_sm2_sign.pem;—— 使用签名证书(非加密证书) -
ssl_certificate_key /path/to/example.com_sm2_sign.key;—— 对应签名私钥 -
ssl_protocols TLSv1.2 TLSv1.3;—— 国密暂不支持 TLS 1.0/1.1,且 TLS 1.3 是 SM2 握手更稳定的选择 -
ssl_ciphers ECDHE-SM4-CBC-SM3:ECDHE-SM4-GCM-SM3;—— 这是国密核心密码套件,不可混用 RSA/ECC 套件,否则协商失败 -
ssl_ecdh_curve SM2;—— 显式指定曲线为 SM2(OpenSSL 3.0+ 必须写,旧教程中的 secp256k1 会导致握手中断)
兼顾兼容性:推荐 SM2/RSA 双证书部署
纯 SM2 站点只能被密信、红莲花等国密浏览器访问,普通 Chrome/Firefox 会报错。生产环境强烈建议双证书策略:
- 申请一对国际标准(RSA 或 ECC)证书 + 一对 SM2 证书;
- 在 Nginx 中用
ssl_certificate指向 RSA 证书链,ssl_certificate_key指向 RSA 私钥; - 通过
ssl_trusted_certificate或证书链合并方式,将 SM2 证书作为备用链提供(部分国密 Nginx 分支支持ssl_certificate_secondary指令); - 更稳妥的做法是使用支持 SNI 的国密 Nginx(如 wotrus_ssl 模块),根据客户端 ClientHello 中的 ALPN 或 signature_algorithms 扩展自动选择证书类型。


















