必须用国密增强版openssl(如gmssl)源码路径编译nginx,configure时指定--with-openssl=/path/to/src(非安装路径),启用--with-http_ssl_module,并验证nginx -v输出含gmssl或新版openssl版本号。

源码编译 Nginx 时要支持国密(SM2/SM3/SM4)或新版强加密(如 TLS 1.3、ChaCha20),关键不是“选模块”,而是替换底层密码库——必须用国密增强版 OpenSSL(如 GMSSL)或新版 OpenSSL 源码,并在 configure 阶段明确指向其解压后的源码根目录。
必须用源码路径,不能用安装路径
Nginx 的 ./configure 脚本只识别 OpenSSL 源码目录结构,不接受已安装的库路径(如 /usr/local/ssl 或 /opt/openssl)。常见错误是把编译安装后的路径传给 --with-openssl,这会导致 configure 失败或静默回退到系统旧版 OpenSSL。
- 正确做法:下载 GMSSL 或 OpenSSL 官方源码包(如
gmssl-3.1.1.tar.gz),解压到某目录(如/usr/local/gmssl-src),保持顶层含Configure、include/、crypto/等子目录 - 不要执行
make install;若已安装过系统 openssl-devel 或 libssl-dev,建议先卸载(yum remove openssl-devel或apt remove libssl-dev),避免自动探测干扰 - 路径示例:
--with-openssl=/usr/local/gmssl-src(注意末尾无斜杠,且该路径下能直接看到Configure文件)
configure 参数写法与关键选项
进入 Nginx 源码目录后,运行 configure 命令时需显式启用 SSL 模块并绑定源码路径。国密场景下还需传递 OpenSSL 构建参数以启用国密套件。
- 基础必选项:
--with-http_ssl_module(Nginx 默认不启用,必须显式声明) - 指定源码路径:
--with-openssl=/usr/local/gmssl-src - 向 OpenSSL 的 Configure 传递参数(可选但推荐):
--with-openssl-opt="enable-tls1_3 enable-sm2 no-asm"(启用 TLS 1.3 和 SM2,禁用汇编提升兼容性) - 补充头文件与链接选项(部分环境需要):
--with-cc-opt="-I/usr/local/gmssl-src/include"和--with-ld-opt="-L/usr/local/gmssl-src/.libs -lssl -lcrypto -lm"
验证是否真正生效
configure 成功不代表 OpenSSL 被正确集成,必须检查两个环节:
- configure 输出末尾应明确出现:
checking for OpenSSL library ... found + using OpenSSL from /usr/local/gmssl-src - 编译完成(
make)后,运行:objs/nginx -V 2>&1 | grep -i openssl,输出应显示类似built with OpenSSL 3.1.1-gm或OpenSSL 3.0.13,而非OpenSSL 1.1.1等旧版本 - 若为动态链接,可用
ldd objs/nginx | grep ssl查看实际加载的libssl.so路径;静态链接则无此输出,但-V结果仍可信
国密部署额外注意事项
仅替换 OpenSSL 不足以完成国密合规,还需配套配置:
- 证书必须为双证书结构:一个用于签名(
domain_sign.crt/.key),一个用于加密(domain_encrypt.crt/.key),不可混用 - Nginx 配置中启用国密套件:
ssl_ciphers "ECC-SM2-SM4-CBC-SHA256:SM2-SM4-CBC-SHA256";,并禁用国际算法(如 RSA、AES-GCM)以满足金融级隔离要求 - 部分定制版 Nginx 需手动修改
auto/lib/openssl/conf文件,将默认的$OPENSSL/.openssl/替换为$OPENSSL/,防止路径查找失败











