直接编译源码集成国密支持是主流可控方式:必须替换为GMSSL或Tongsuo等国密版密码库,再显式指定路径重新编译Nginx;配置需启用双证书、限定TLSv1.2+协议及ECC-SM4-CBC-SM3等国密套件,并确保ssl_prefer_server_ciphers on。

直接编译源码集成国密支持,是目前最主流且可控的方式。Nginx 本身不原生支持 SM2/SM3/SM4,必须替换或对接国密版密码库(如 GMSSL 或 Tongsuo),再重新编译 Nginx 二进制文件。
准备国密底层密码库
这是最关键的前置步骤。不能直接用系统自带 OpenSSL,需部署兼容国密算法的替代实现:
- 推荐使用 GMSSL(开源国密 OpenSSL 分支)或 Tongsuo(阿里系国密增强版 OpenSSL),二者均完整实现 SM2/SM3/SM4 及 TLS 国密协议栈
- 下载对应版本(如
gmssl_openssl_1.1_b2024_x64.tar.gz),解压到固定路径(例如/usr/local/gmssl) - 确认头文件和库文件存在:
/usr/local/gmssl/include/openssl/和/usr/local/gmssl/lib/libcrypto.so - 若用 Tongsuo,还需提前安装
tongsuo-devel包及构建依赖(gcc-c++、perl、make等)
获取并配置 Nginx 源码
选用稳定版本(如 nginx-1.18.0),避免过新版本与国密库存在 ABI 兼容问题:
- 下载官方 Nginx 源码包,解压后进入目录
- 执行
./configure时显式指定国密 OpenSSL 路径,例如:
--with-openssl=/usr/local/gmssl \<br> --with-cc-opt="-I/usr/local/gmssl/include" \<br> --with-ld-opt="-L/usr/local/gmssl/lib -lm"
- 务必启用 SSL 模块:
--with-http_ssl_module,禁用可能冲突的模块(如--without-http_gzip_module可选) - 若需 HTTP/2 支持,加上
--with-http_v2_module(国密 TLSv1.2+ 已兼容)
编译与安装国密版 Nginx
完成配置后,执行标准构建流程:
- 运行
make编译(过程可能耗时几分钟,注意终端无报错) - 执行
sudo make install安装,默认路径为/usr/local/nginx - 验证新二进制是否链接正确:
/usr/local/nginx/sbin/nginx -V,输出中应包含built with GMSSL或类似字样,并确认--with-openssl=...路径准确 - 备份旧版 Nginx 二进制(如有),避免覆盖后无法回退
配置双证书与国密 TLS 参数
编译完成后,Nginx 才具备解析 SM2 证书和协商国密套件的能力:
- 准备四份文件:
sm2.crt(SM2 公钥证书)、sm2.key(未加密 SM2 私钥)、rsa.crt、rsa.key - 在
server块中声明双证书(顺序重要,国密优先):
ssl_certificate /path/to/sm2.crt;<br> ssl_certificate_key /path/to/sm2.key;<br> ssl_certificate /path/to/rsa.crt;<br> ssl_certificate_key /path/to/rsa.key;
- 限定协议与套件:
ssl_protocols TLSv1.2 TLSv1.3;<br> ssl_ciphers ECC-SM4-CBC-SM3:ECDHE-SM4-CBC-SM3:RSA-SM4-CBC-SM3;<br> ssl_ecdh_curve sm2p256v1;
- 确保
ssl_prefer_server_ciphers on;开启,保证服务端套件优先权
整个过程不依赖动态模块加载,稳定性高,但每次 Nginx 升级都需要重新编译。适合对合规性要求严格的政企场景。


















