Nginx 实现国际与国密SSL无缝兼容的核心是客户端驱动的TLS协商机制,依赖国密增强OpenSSL(如Tongsuo/GMSSL)、正确编译配置、SM2证书及私钥、国密优先的套件与曲线设置(ssl_ecdh_curve sm2p256v1),单virtual host内即可完成双栈协商。

Nginx 实现国际与国密(SM2)SSL 证书的无缝兼容调度,核心不是“双证书并列加载”后靠 Nginx 自动分流,而是依赖客户端驱动的 TLS 协商机制——服务端提供多算法支持能力,由浏览器在 ClientHello 阶段声明支持的密码套件和椭圆曲线,Nginx(配合国密增强 OpenSSL)据此选择最优匹配路径。真正“无缝”的前提是底层密码库、编译配置、证书格式、协议套件四者协同。
以下为生产级可行的关键步骤:
必须使用国密增强版 OpenSSL 替代标准库
原生 OpenSSL 和官方 Nginx 完全不识别 SM2/SM3/SM4。你得选用:
- ✅ Tongsuo(蚂蚁开源,TLS 1.3 国密支持成熟,推荐首选)
- ✅ GMSSL(生态稳定,文档齐全,适合政务类项目)
验证方式:运行tongsuo version或gmssl version,输出中需含sm2、sm3、sm4;再执行openssl ecparam -list_curves | grep sm2应有回显。
编译 Nginx 时绑定国密 OpenSSL 路径
不能只装系统 OpenSSL。configure 必须指定:
./configure \ --with-http_ssl_module \ --with-openssl=/path/to/tongsuo \ # 关键!指向国密 OpenSSL 源码或安装目录 --with-openssl-opt="enable-sm2 enable-sm3 enable-sm4"
编译后用 nginx -V 2>&1 | grep -i openssl 确认链接的是 Tongsuo/GMSSL,而非 /usr/lib64/libssl.so。
单 virtual host 内启用双栈协商(非双 listen)
无需开两个 443 端口,也不用写两套 server 块。只需在同一个 server { ... } 中配置:
listen 443 ssl; server_name example.com; # 仅需一组证书:SM2 签名证书 + 对应 SM2 私钥(国密握手靠它驱动) ssl_certificate /etc/nginx/certs/sm2_fullchain.pem; # 含 SM2 公钥,含中间 CA ssl_certificate_key /etc/nginx/certs/sm2.key; # 必须是 SM2 格式私钥(非 RSA) # 协议与套件:国密优先,国际兼容紧随其后 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # TLCP 对应 TLS 1.1,但建议保留 1.2/1.3 供国际客户端回退 ssl_ciphers "TLS_SM4_SM3:ECDHE-SM4-SM3:SM4-SM3:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256"; ssl_prefer_server_ciphers on; # 强制服务端选套件,避免客户端低优套件干扰 # 曲线指定(关键!否则国密客户端协商失败) ssl_ecdh_curve sm2p256v1;
证书准备要满足国密合规性,不是简单拼两个 PEM
- ✅ 向 CFCA、沃通、DNSPod 国密版等具备商用密码资质的 CA 申请 SM2 签名证书(含完整证书链)
- ✅ 私钥必须用
openssl ecparam -name sm2p256v1 -genkey生成,不可用 RSA 私钥混用 - ❌ 不需要额外配置
ssl_certificate_enc(仅金融网关等严格双证场景才用) - ✅ 国际浏览器会自动跳过国密套件,协商
ECDHE-ECDSA-AES128-GCM-SHA256等标准套件,前提是你的证书链也包含对应 RSA/ECC 公钥?不——实际中,一份 SM2 证书即可支撑双栈,因为现代国密 CA(如 CFCA)签发的 SM2 证书本身已内置双签信息(SM2 + SHA256-RSA 双签名),国际客户端可验证 RSA 签名部分,国密客户端验证 SM2 签名部分。
验证是否生效,不能只看语法检查
- 用国密浏览器(红莲花、360国密版)访问,F12 查看连接详情 → 显示“TLS_SM4_SM3”或“ECDHE-SM4-SM3”即成功
- 用 Chrome/Firefox 访问,抓包看 ClientHello 是否含
sm2p256v1曲线 —— 不含是正常的,它会协商 AES-GCM 套件 - 日志检查:
tail -f /var/log/nginx/error.log,出现no suitable key share或no shared cipher表示曲线或套件不匹配,重点查ssl_ecdh_curve和ssl_ciphers顺序
不复杂但容易忽略


















