必须使用tongsuo等国密增强库编译nginx,配置双sm2证书、国密专用tlsv1.3套件及路径级mtls策略,才能实现gb/t 38636–2020合规的强制国密双向认证。

要在 Nginx 中对 API 接口实施强制国密双向认证(即基于 SM2/SM3/SM4 的 mTLS),不能仅靠常规 SSL 配置。它需要底层密码库支持、双证书结构适配、协议层协商控制,以及路径级策略落地。核心难点不在 Nginx 本身,而在于“让 TLS 握手阶段就走国密流程,并完成客户端身份核验”。
必须使用国密增强版 OpenSSL 兼容库
标准 Nginx 编译链接的是通用 OpenSSL,不识别 TLS_SM4_GCM_SM3 等国密套件,握手会直接失败并报错 no shared cipher 或 handshake failure。
- 推荐选用 Tongsuo(原 BabaSSL)9.0+,其完整实现 GB/T 38636–2020,API 与 OpenSSL 兼容,社区活跃
- Nginx 源码需显式指定该库编译:
./configure --with-openssl=../tongsuo --with-http_ssl_module - 验证是否生效:启动后执行
nginx -V 2>&1 | grep -i sm2,应能显示启用的国密算法标识
配置国密双证书与强制校验逻辑
国密要求签名证书与加密证书分离。Nginx 必须按顺序加载两者,且均需为 SM2 格式;同时开启客户端证书强制验证。
- 服务端证书配置(顺序不可颠倒):
ssl_certificate /etc/nginx/certs/server_sign.crt;
ssl_certificate_key /etc/nginx/certs/server_sign.key;
ssl_certificate /etc/nginx/certs/server_encrypt.crt;
ssl_certificate_key /etc/nginx/certs/server_encrypt.key; - 双向认证核心指令(放在
server块内):
ssl_client_certificate /etc/nginx/certs/gmca.crt;
ssl_verify_client on;
ssl_verify_depth 2; -
gmca.crt是你自建的国密根 CA 证书(PEM 格式),用于验证所有客户端证书链,必须由 Tongsuo 或 GmSSL 签发,不能是 RSA CA
限定策略作用于敏感 API 路径
不必全站强制国密 mTLS,可精准控制到具体接口路径,兼顾兼容性与安全性。
- 在
location /api/v1/finance/或/internal/auth等路径块中启用可选验证:
ssl_verify_client optional; - 配合
if ($ssl_client_verify != 'SUCCESS') { return 403; }实现路径级拦截 - 或更稳妥地透传验证结果给后端,在应用层统一鉴权:
proxy_set_header X-Client-Verify $ssl_client_verify;
proxy_set_header X-Client-DN $ssl_client_s_dn;
启用国密专用 TLS 协议与加密套件
禁用国际套件,只保留国密协商能力,防止降级攻击。
- 明确指定协议版本:
ssl_protocols TLSv1.3;(GB/T 38636 要求 TLS 1.3+) - 设置国密专属 cipher list(Tongsuo 提供):
ssl_ciphers TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3; - 关闭非国密协商:
ssl_prefer_server_ciphers on;
ssl_ecdh_curve sm2p256v1;
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











