Nginx官方主线版本不原生支持国密算法,需用GMSSL 3.1.1+替换OpenSSL并重新编译,配置ssl_protocols和含TLS_SM4_SM3的ssl_ciphers,加载SM2证书及私钥,方可实现合规国密TLS握手。

目前 Nginx 官方主线版本(截至 1.25.x)不原生支持 SM2/SM3/SM4 等国密算法,无法直接通过 standard SSL 指令启用国密 TLS 握手或证书验证。实现金融级国密合规网关,需依赖定制化改造——核心路径是使用支持国密的 OpenSSL 分支(如 OpenSSL-SM 或 GMSSL)重新编译 Nginx,并配合国密专用模块(如 nginx-gm)或补丁方案。
一、基础环境准备:替换底层密码库
国密能力必须从 TLS 底层协议栈注入,Nginx 本身不处理加解密逻辑,而是调用 OpenSSL API。因此第一步是替换其依赖的 OpenSSL:
- 下载并编译 GMSSL 3.x(推荐 v3.1.1+,已完整支持 TLS 1.1–1.3 国密套件,如
TLS_SM4_SM3、TLS_SM4_SHA256); - 配置 Nginx 编译时指定
--with-openssl=指向 GMSSL 源码目录,而非系统 OpenSSL; - 禁用默认 crypto 引擎(
--without-http_ssl_module不可选),确保所有 SSL 调用走 GMSSL 实现; - 验证编译后 Nginx 的 OpenSSL 版本:
nginx -V 2>&1 | grep -o 'OpenSSL [^ ]*'应显示OpenSSL 3.1.1-gm类似字样。
二、启用国密 TLS 握手:配置 server 块关键参数
仅替换 OpenSSL 不够,还需显式启用国密协商机制。GMSSL 扩展了 OpenSSL 的 cipher list 语法,Nginx 配置中需精确指定:
- 使用
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;(国密 TLS 1.3 在 GMSSL 3.1+ 已稳定); -
ssl_ciphers必须包含国密套件,例如:"ECDHE-SM4-SM3:SM4-SM3:TLS_SM4_SM3:TLS_SM4_SHA256";
注意:顺序影响优先级,建议将TLS_SM4_SM3置前以优先协商国密通道; - 加载国密证书链:
ssl_certificate指向 SM2 签发的 PEM 格式证书(含 SM2 公钥),ssl_certificate_key指向对应 SM2 私钥(PEM 或 PKCS#8 加密格式); - 开启 OCSP Stapling(若 CA 支持国密 OCSP):
ssl_stapling on;+ssl_trusted_certificate指向国密根/中间 CA 证书。
三、对接金融监管要求:双向认证与日志审计增强
金融场景常要求客户端证书认证(mTLS)及完整握手日志留存。GMSSL+Nginx 可满足,但需额外配置:
- 启用双向认证:
ssl_verify_client on;,并用ssl_client_certificate指定受信的国密 CA 证书(SM2 签发); - 记录国密协商结果:在
log_format中加入$ssl_protocol和$ssl_cipher,可识别出TLSv1.3+TLS_SM4_SM3等合规组合; - 避免降级风险:显式禁用非国密弱套件,如
!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; - 如需 SM2 签名验签逻辑(如 API 请求头验签),需在 upstream 层由业务服务完成——Nginx 仅负责传输层国密加密,不处理应用层国密签名。
四、生产部署注意事项与验证方法
上线前必须完成多维度验证,避免“伪国密”:
- 使用
openssl s_client -connect your.domain:443 -cipher "TLS_SM4_SM3" -tls1_3主动协商,确认返回Protocol : TLSv1.3且Cipher : TLS_SM4_SM3; - 用国密浏览器(如红莲花、360国密版)或
curl --tlsv1.3 --ciphers TLS_SM4_SM3(需 libcurl 链接 GMSSL)实测访问; - 检查 Nginx error log 是否出现
no suitable signature algorithm—— 常因证书私钥非 SM2 格式或未启用ssl_ecdh_curve sm2; - 金融等保测评关注“密钥生命周期管理”,建议将 SM2 私钥存于 HSM 或 KMS,并通过引擎接口加载(GMSSL 支持
engine指令调用国密 HSM)。











