编译支持国密算法的 Nginx,核心思路是使用支持国密的SSL库替换Nginx默认的OpenSSL。主要有以下几种方案,你可以根据需求选择。
一、核心思路与方案对比
方案 核心组件 特点与适用场景
方案一:GmSSL GmSSL 库 国产开源密码库,社区活跃,适合学习研究及大多数国密改造项目。
方案二:Tongsuo (铜锁) Tongsuo 库 功能强大的开源密码库,提供`ntls`模块,配置相对简洁。
方案三:Angie Angie 服务器 | Nginx 官方分支,内置国密支持,无需编译,开箱即用,省心省力。
方案四:商业模块 厂商提供的国密模块 适用于已购买特定厂商(如沃通)国密SSL证书的场景,按官方文档操作即可。
二、方案一:使用 GmSSL 编译 Nginx (最通用)
这是最常用的方法,通过编译 GmSSL 来为 Nginx 提供国密算法支持。
1. 安装编译依赖
首先,安装编译所需的开发工具和库。
bash
CentOS / RHEL
yum install -y gcc gcc-c++ make pcre-devel zlib-devel
Ubuntu / Debian
apt-get install -y build-essential libpcre3-dev zlib1g-dev
2. 下载并编译 GmSSL
建议选择稳定的 `v2.5.4` 版本,因为它能很好地兼容 Nginx。
bash
下载 GmSSL 源码
wget https://github.com/guanzhi/GmSSL/archive/refs/tags/v2.5.4.tar.gz -O GmSSL-2.5.4.tar.gz
tar -zxvf GmSSL-2.5.4.tar.gz
cd GmSSL-2.5.4
配置、编译并安装到 /usr/local/gmssl
./config --prefix=/usr/local/gmssl shared
make -j$(nproc)
make install
3. 下载并编译 Nginx
在配置 Nginx 时,通过 `--with-openssl` 指定 GmSSL 的路径。
bash
下载 Nginx 源码 (以稳定版 1.24.0 为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
配置编译选项
./configure \
prefix=/usr/local/nginx \
with-http_ssl_module \
with-openssl=/usr/local/gmssl \
with-cc-opt="-I/usr/local/gmssl/include" \
with-ld-opt="-lm"
编译并安装
make && make install
注意:若编译过程中遇到 `ssl.h] Error 127` 等头文件找不到的错误,可能需要手动修改 `auto/lib/openssl/conf` 文件,确保 `CORE_INCS` 等变量正确包含了 GmSSL 的 `include` 目录。
三、方案二:使用 Tongsuo (铜锁) 编译 Nginx
Tongsuo 提供了专门的 `ntls` 模块,配置更聚焦。
1. 下载 Tongsuo 和 Nginx 源码
bash
下载 Tongsuo 源码
git clone https://github.com/Tongsuo-Project/Tongsuo.git
下载 Nginx 源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
2. 编译并配置**
bash
cd nginx-1.24.0
./configure \
with-http_ssl_module \
with-openssl=../Tongsuo \
with-openssl-opt=enable-ntls \
with-ntls
make && make install
四、方案三:使用 Angie (最省心)
如果你希望完全避免编译的复杂性,Angie 是一个极佳的选择。它是 Nginx 的一个活跃分支,已经默认集成了对国密算法的支持。
你只需从 [Angie官网](https://en.angie.software) 下载对应操作系统的安装包直接安装即可,无需编译。其配置文件与 Nginx 几乎完全兼容。
五、验证与配置
无论采用哪种方案,编译安装后,都需要在 Nginx 配置文件中进行设置。
1. 验证国密库是否生效
bash
/usr/local/gmssl/bin/openssl version
/usr/local/gmssl/bin/openssl list -cipher-algorithms | grep SM4
2. Nginx 国密配置示例 (以 Tongsuo 为例)**
在 `nginx.conf` 的 `server` 块中,配置如下:
nginx
server {
listen 443 ssl;
server_name your-domain.com;
启用国密 (Tongsuo 专用指令)
ssl_ntls on;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
指定国密套件
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3";
ssl_prefer_server_ciphers on;
双证书配置:签名证书和加密证书
ssl_certificate /path/to/your-sign-cert.pem /path/to/your-encrypt-cert.pem;
ssl_certificate_key /path/to/your-sign-key.pem /path/to/your-encrypt-key.pem;
# ...
}
国密SSL证书通常是“双证书”体系,包含签名证书和加密证书。如果只有单证书,可能需要咨询证书提供商。
五、常见问题与解决思路
报错 `C compiler cc is not found`:系统缺少编译工具,请安装 `gcc` 和 `make`。
报错 `ssl.h] Error 127`:Nginx 找不到 GmSSL 头文件,请检查 `--with-cc-opt` 参数路径是否正确。
报错 `undefined symbol: xxx`:动态链接库路径问题。可尝试设置环境变量 `export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH`。
浏览器无法访问:请确保服务器防火墙已开放 `443` 端口,并使用支持国密的浏览器(如奇安信浏览器)并开启“启用国密SSL通信”选项进行访问。
总结
1. 追求省心:直接选择 Angie,省去编译步骤。
2. 通用方案:使用 GmSSL,这是最主流、资料最丰富的方案。
3. 尝鲜新方案:可以尝试 Tongsuo (铜锁)。
请根据用户的技术偏好和实际环境选择最适合的方案。如果在操作中遇到具体问题,可以随时补充细节,随时协助。