用户要为Nginx配置国密(SM2/SM3/SM4)支持,核心思路是使用支持国密算法的密码库(如Tongsuo或GmSSL)替换掉Nginx默认的OpenSSL,并进行编译。
with-openssl` 等配置参数,正是实现这一替换的关键。
一、核心编译配置参数详解
1. `--with-openssl=<path>`
作用:这是最关键的一步。该参数告诉Nginx在编译时,不要使用系统默认的OpenSSL库,而是去你指定的路径下寻找并使用**支持国密算法的密码库**(如Tongsuo或GmSSL)。
示例:`--with-openssl=../Tongsuo-8.3.0`。这个路径是相对于Nginx源码目录的。
2. `--with-openssl-opt=enable-ntls`
作用:这个参数是传递给OpenSSL(或Tongsuo等兼容库)的编译选项。`enable-ntls` 明确启用了对国密SSL协议(National TLS) 的支持,是让密码库真正“听懂”国密的关键。
3. `--with-ntls`
作用:这个参数用于启用Nginx自身的国密TLS(NTLS)功能模块。它让Nginx在SSL/TLS握手等环节,能够正确处理国密协议。
注意:此参数是Nginx国密分支或经过改造的版本(如Angie)特有的,标准的Nginx官方源码中没有这个选项。
4. `--with-http_ssl_module`
作用:这是一个标准的Nginx编译参数,用于启用HTTP的SSL/TLS模块。无论是否为国密,只要你需要HTTPS功能,就必须加上它。
二、一个完整的配置示例
结合以上参数,一个典型的国密Nginx `./configure` 命令如下:
bash
./configure \
with-openssl=../Tongsuo-8.3.0 \
with-openssl-opt=enable-ntls \
with-ntls \
with-http_ssl_module
... 你可以在此添加其他所需模块,如 --with-http_v2_module 等
说明:这个示例假设你已经将Tongsuo的源码解压到了Nginx源码目录的上一级,即`../Tongsuo-8.3.0`。
三、几个重要提醒
源码选择:标准的Nginx官方源码**不包含** `--with-ntls` 等参数。你需要使用经过国密改造的版本,例如:
Angie:一个由前Nginx员工创建的活跃分支,内置了国密支持。
Tongsuo(铜锁):一个由国内厂商维护的、支持国密的密码库,常与Nginx搭配使用。
各大厂商或社区发布的“国密Nginx”定制版。
双证书配置:国密SSL通信通常采用“双证书”体系,即一个签名证书和一个加密证书。在Nginx配置文件中,你需要同时指定这两个证书及其私钥。
加密套件配置:在`nginx.conf`中,需要通过`ssl_ciphers`指令配置国密加密套件,例如:
ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3:...;
总结
总的来说,为Nginx配置国密支持,本质上是编译时的“换芯”:用一个支持国密的“心脏”(如Tongsuo密码库)替换原有的,并通过特定的编译参数(`--with-openssl`, `--with-ntls`等)让它们协同工作。这不仅是简单的配置调整,而是一次从底层密码库到上层应用软件的深度适配。