nginx原生不支持国密算法,必须替换为gmssl或tongsuo等国密增强版openssl,源码编译nginx并绑定该库,再配置sm2双证书、tlcp协议及ecdhe-sm2-with-sm4-sm3等国密套件方可实现合规支持。

直接编译 Nginx 源码集成国密 SSL 支持,核心不是“加一个模块”,而是**替换底层密码库并确保整个构建链路指向国密实现**。OpenSSL 原生不识别 SM2 曲线、SM3 摘要或 SM4 套件名,哪怕你在配置里写 ECDHE-SM2-SM4-SM3,也会被静默忽略或报错。必须用 GMSSL 或 Tongsuo 替代 OpenSSL,并让 Nginx 编译过程完全绑定它。
确认并安装国密增强版 OpenSSL(GMSSL/Tongsuo)
这是前提,不可跳过:
- 下载稳定版 GMSSL(推荐 v3.1.1+)或 Tongsuo(如 v8.3.0),务必用 tag 版本,避免 master 分支的实验性代码
- 编译安装时启用关键选项:
enable-sm2 enable-sm3 enable-sm4 enable-ntls(NTLS 是国密 TLS 协议栈,即 TLCP) - 统一安装路径,例如
/usr/local/gmssl,避免与系统 OpenSSL 冲突 - 验证是否生效:
gmssl version输出含GMSSL字样;openssl ecparam -list_curves | grep sm2有回显;ldd $(which nginx) | grep ssl尚未运行,但后续编译后需指向该路径
源码编译 Nginx 并绑定国密 OpenSSL
Nginx 官方源码未适配 SM2 证书 ASN.1 结构、TLCP 扩展字段和 Key Usage 校验逻辑,不能靠 patch 模块解决:
- 下载 Nginx 源码(如 1.20.1 或 1.22.x),解压后进入目录
- 执行 configure 时明确指定:
./configure \<br> --with-http_ssl_module \<br> --with-openssl=/usr/local/gmssl \<br> --with-openssl-opt="enable-sm2 enable-sm3 enable-sm4"
- 若使用 Tongsuo,还需加
--with-ntls参数,并确保ssl_ntls on;在配置中启用 - 手动检查
auto/lib/openssl/conf文件,确认CORE_INCS、CORE_LIBS等变量均指向 GMSSL 的 include 和 lib 目录
验证编译结果与基础配置
编译安装后,必须逐层确认是否真正生效:
- 运行
nginx -V 2>&1 | grep -i openssl,输出中的built with OpenSSL路径应为/usr/local/gmssl - 执行
/usr/local/gmssl/bin/openssl version -a,确认版本号及含GMSSL标识 - 在 Nginx 配置中启用国密协议和套件:
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers "ECDHE-SM2-WITH-SM4-SM3:ECC-SM2-SM4-CBC-SM3"; - 证书与私钥必须为 SM2 格式:PEM 中含
-----BEGIN EC PRIVATE KEY-----且曲线为sm2p256v1;证书需由国密 CA 签发,含正确subjectAltName
可选:集成 nginx_gm 模块(仅当需要高级控制)
该模块提供更细粒度的国密行为管理(如强制双向认证、OCSP Stapling 国密适配等),但非必需:
- 下载与当前 Nginx 版本严格匹配的
nginx_gm分支(如 Nginx 1.22 → v1.22 tag) - 在 GMSSL 源码根目录先执行
make install_dev,否则 configure 会找不到gmssl.h - configure 时追加:
--add-module=/path/to/nginx_gm,并确保仍保留--with-openssl=... - 若链接失败(如
undefined reference to EVP_sm4_cbc),需手动修改objs/Makefile,在LIBS行补上-lgmssl











