编译支持国密算法的  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  (铜锁)。

请根据用户的技术偏好和实际环境选择最适合的方案。如果在操作中遇到具体问题,可以随时补充细节,随时协助。