需使用国密增强版Nginx(如GMSSL 3.x或OpenSSL国密分支编译)并配置SM2证书、SM2私钥及国密套件,server块中启用TLSv1.2+、指定ssl_ciphers为ECDHE-SM2-SM4-CBC-SM3等、设置ssl_ecdh_curve sm2p256v1。

要在 Nginx 的 server 块中启用 SSL 并支持国密(SM2/SM3/SM4)加密套件,需满足两个前提:Nginx 必须基于支持国密的 OpenSSL(如 OpenSSL 1.1.1f+ 国密分支 或 GMSSL),且编译时已启用国密支持;同时需使用符合国密标准的证书(SM2 证书)及配套密钥。
确认 Nginx 支持国密协议与套件
普通 Nginx 官方版本不支持国密。必须使用国密增强版,例如:
- 基于 GMSSL 编译的 Nginx(推荐 GMSSL 3.x + Nginx 1.20+)
- 或采用 OpenSSL 国密分支(如中科院数据所维护的 openssl-gm)并重新编译 Nginx
- 验证是否生效:运行
nginx -V 2>&1 | grep -i "openssl\|gmssl",输出中应含国密相关字样;再执行openssl ciphers -s -v | grep SM(用对应 openssl 二进制)应能列出SM2-SM4-SM3等套件
准备国密证书与密钥文件
国密 HTTPS 要求使用 SM2 公钥证书和对应 SM2 私钥(非 RSA/ECC),且建议搭配 SM2 CA 签发的完整证书链。常见文件包括:
-
server.sm2.crt:站点 SM2 证书(PEM 格式) -
server.sm2.key:SM2 私钥(需未加密或用ssl_password_file指定解密口令) -
ca-bundle.sm2.crt:国密根/中间 CA 证书链(可选,但推荐提供以提升兼容性)
注意:不能混用 RSA 证书与 SM2 密钥,否则启动失败;SM2 私钥格式与传统 PEM 不同,需确保是 GMSSL/OpenSSL-gm 生成的标准 SM2 key。
在 server 块中配置国密 SSL 参数
以下为典型配置片段(监听 443,强制国密优先):
server {
listen 443 ssl;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 证书与密钥(必须为 SM2 类型)
ssl_certificate /path/to/server.sm2.crt;
ssl_certificate_key /path/to/server.sm2.key;
ssl_trusted_certificate /path/to/ca-bundle.sm2.crt;
# 启用 TLSv1.2+(国密仅支持 TLS 1.2 及以上)
ssl_protocols TLSv1.2 TLSv1.3;
# 仅启用国密套件,禁用国际算法(如需双栈,请见下文说明)
ssl_ciphers ECDHE-SM2-SM4-CBC-SM3:SM2-SM4-CBC-SM3;
# 启用国密服务端身份认证(关键)
ssl_ecdh_curve sm2p256v1;
# 其他安全加固(可选)
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;}
说明:
-
ssl_ciphers中的SM2-SM4-CBC-SM3是基础国密套件;若使用 TLS 1.3,需确认所用 OpenSSL/gmssl 版本支持TLCP(国密 TLS 协议)或扩展的 TLS 1.3 国密套件(如SM2-SM4-GCM-SM3) -
ssl_ecdh_curve sm2p256v1明确指定使用 SM2 曲线进行密钥交换 - 若需兼容国际浏览器(如 Chrome/Firefox),必须部署双栈(SM2 + RSA 双证书),此时需使用 OpenSSL 3.0+ 支持多密钥证书 或借助
ssl_certificate_by_lua*(OpenResty)动态选择,标准 Nginx 不支持单 IP 多证书
双栈支持(SM2 + RSA)的实用方案
因主流浏览器暂不原生支持国密套件,生产环境常采用“国密优先、国际兜底”策略。可行方式有:
-
双 IP 或双域名分流:如
https://sm.example.com走纯国密,https://www.example.com走 RSA,后端逻辑一致 -
OpenResty + Lua 动态协商:利用
ssl_certificate_by_lua_block检查 ClientHello 中的 cipher_suites,匹配0x00\0x9A(SM2-SM4-SM3)等国密套件标识,再加载对应证书 - 前置国密网关:由专用国密网关(如江南科友、格尔、信安世纪设备)终止国密 TLS,Nginx 仅处理后端 HTTP
纯软件双栈在标准 Nginx 中不可行,切勿尝试用 ssl_certificate 多次声明——语法错误且不生效。











