Nginx 支持国密需替换为国密增强版 OpenSSL(如 GMSSL)并重新编译,因其不自带 SM2/SM3/SM4 实现;必须使用 GMSSL、国密定制 Nginx 和双证书结构的 SM2 证书三者组合,配置 ssl_ciphers 启用国密套件并禁用国际算法。

标准 Nginx 本身不支持 SM2/SM3/SM4,因为它依赖的 OpenSSL 默认只集成国际算法。要让 Nginx 支持国密,核心不是“加个模块”,而是替换底层密码学基础——必须使用国密增强版 OpenSSL(如 GMSSL),并基于它重新编译 Nginx。
为什么不能靠“Nginx 模块”直接启用国密?
SM2、SM3、SM4 不是 HTTP 层协议,而是 TLS 握手和加密过程中的底层密码原语。Nginx 的 http_ssl_module 只负责调用 OpenSSL 提供的 API,自身不实现加解密逻辑。当你配置 ssl_ciphers SM2-SM3-SM4... 时,实际是把指令传给 OpenSSL;若 OpenSSL 不认识这些套件名,Nginx 就无法协商成功。所谓“国密模块”,本质是替换了 OpenSSL 动态库,并在编译 Nginx 时指向它。
必须使用的组件组合
合规金融网关需确保全链路国密能力,以下三者缺一不可:
- GMSSL(国密版 OpenSSL):提供 SM2 密钥交换与签名、SM3 摘要、SM4 对称加密的完整实现,已通过国家密码管理局商用密码检测中心认证
-
国密定制版 Nginx:源码编译,configure 时明确指定
--with-openssl=/usr/local/gmssl,且需修改 auto/lib/openssl/conf 中路径引用,避免默认查找系统 OpenSSL -
双证书结构的 SM2 证书:包含两个独立证书文件 ——
domain_sign.crt/.key(用于身份认证与数字签名)和domain_encrypt.crt/.key(用于密钥封装与数据加密),二者不可混用
关键配置项与验证要点
完成编译安装后,在 Nginx 配置中启用国密需注意:
-
ssl_certificate 和 ssl_certificate_key 必须分别指向签名证书和签名私钥;加密证书和私钥需通过
ssl_certificate_by_lua_block或第三方模块(如 nginx-gmssl)动态加载,或由上游 WAF/网关代为处理 -
ssl_ciphers 应启用国密优先套件,例如:
ssl_ciphers ECDHE-SM2-SM4-SM3:SM2-SM4-SM3;
禁用所有含 RSA、AES、SHA256 的国际套件,防止降级攻击 -
ssl_protocols 建议限定为
TLSv1.1 TLSv1.2,因国密 TLS 扩展目前在 TLS 1.3 中尚未完全标准化 - 部署后务必用
openssl s_client -connect yourdomain.com:443 -cipher SM2测试握手是否成功,而非仅看浏览器显示
金融场景下的兼容性与审计要求
面向公众服务的金融网关,需同时满足技术合规与监管验收:
- 国产浏览器(360、红莲花、奇安信可信浏览器等)应显示绿色锁标识,且证书详情中可查看 SM2 签名算法和 SM3 指纹
- 国际浏览器(Chrome/Firefox)出现“证书不受信任”属正常现象,不影响国密通道建立;但需在前端提示栏说明“推荐使用国产安全浏览器以获得完整国密保护”
- 等保三级及金融行业监管检查中,需提供:
– GMSSL 版本号及商用密码产品认证证书编号
– Nginx 编译参数截图(含 --with-openssl 路径)
– 双证书 PEM 文件的算法字段输出(openssl x509 -in domain_sign.crt -text -noout | grep "Signature Algorithm"应显示 sm2sign)











