编译国密Nginx时报  `ssl.h`  错误,核心原因通常是  Nginx  找不到正确的国密SSL头文件路径。这主要与GmSSL的版本、安装路径或Nginx的配置方式有关。

这里梳理了5种有效的解决方案,你可以根据自己的情况选择。

方案一:检查并确认GmSSL安装路径

首先,确认GmSSL已正确安装,并找到  `ssl.h`  文件的实际位置。

bash

#  检查GmSSL的安装目录结构

ls  /usr/local/gmssl

#  正常应包含  bin,  include,  lib  等目录

#  查找  ssl.h  文件

find  /usr/local/gmssl  -name  "ssl.h"

如果文件存在于  `/usr/local/gmssl/include/openssl/ssl.h`  或  `/usr/local/gmssl/include/gmssl/ssl.h`,请记下这个路径。

方案二:调整Nginx编译参数(推荐)

在运行  `./configure`  时,通过以下参数明确指定GmSSL的头文件和库文件路径,这是最直接有效的方法。

bash

./configure  \

        --prefix=/usr/local/nginx  \

        --with-http_ssl_module  \

        --with-openssl=/path/to/gmssl/source    #  指向GmSSL的源码目录

        --with-cc-opt="-I/usr/local/gmssl/include"    #  指定头文件路径

        --with-ld-opt="-L/usr/local/gmssl/lib"          #  指定库文件路径

注意:`--with-openssl`  应指向**GmSSL的源码目录**,而非安装目录。

方案三:修改Nginx构建配置文件

如果方案二无效,可以手动修改Nginx源码中的  `auto/lib/openssl/conf`  文件,强制指定正确的路径。

1.    打开文件:

        bash

        vim  /path/to/nginx-source/auto/lib/openssl/conf

  2.    找到并修改以下行,将  `/.openssl`  部分移除:

        ```diff

        -  CORE_INCS="$CORE_INCS  $OPENSSL/.openssl/include"

        -  CORE_DEPS="$CORE_DEPS  $OPENSSL/.openssl/include/openssl/ssl.h"

        -  CORE_LIBS="$CORE_LIBS  $OPENSSL/.openssl/lib/libssl.a"

        -  CORE_LIBS="$CORE_LIBS  $OPENSSL/.openssl/lib/libcrypto.a"

        +  CORE_INCS="$CORE_INCS  $OPENSSL/include"

        +  CORE_DEPS="$CORE_DEPS  $OPENSSL/include/openssl/ssl.h"

        +  CORE_LIBS="$CORE_LIBS  $OPENSSL/lib/libssl.a"

        +  CORE_LIBS="$CORE_LIBS  $OPENSSL/lib/libcrypto.a"

  3.    保存后重新运行  `./configure`  和  `make`。

方案四:处理多版本OpenSSL冲突

系统中若同时存在多个OpenSSL版本,可能导致Nginx选错路径。

1.    检查当前环境:

        bash

        openssl  version  -a              #  查看当前使用的版本

        pkg-config  --modversion  openssl  #  检查pkg-config识别的版本

  2.    屏蔽系统干扰:临时重命名系统默认的  `openssl.pc`  文件,避免  `pkg-config`  干扰。

        bash

        sudo  mv  /usr/lib64/pkgconfig/openssl.pc  /usr/lib64/pkgconfig/openssl.pc.bak

  3.    重新配置编译:再次尝试方案二,确保参数指向正确的GmSSL路径。

方案五:使用合适的GmSSL版本或专用Nginx分支

不同版本的GmSSL与Nginx的兼容性不同,选择正确的组合至关重要。

方案      说明      适用场景  

使用GmSSL  v2          GmSSL  v2  提供与OpenSSL兼容的API,更容易与官方Nginx集成。    希望使用官方Nginx源码,追求稳定兼容。  

使用GmSSL  v3专用Nginx分支          GmSSL  v3  不兼容OpenSSL  API,必须使用为其修改的Nginx分支,如  `nginx-with-GmSSLv3`。      需要使用GmSSL  v3的新特性。  

使用其他国密方案          考虑  Tongsuo(铜锁)或  TASSL等其他国密SSL库。  |  GmSSL无法满足需求时作为备选。  

总结与建议

总的来说,处理这个问题的核心思路是:确保Nginx在编译时能准确找到国密SSL库的头文件和库文件。

1.    首选方案二:通过  `--with-cc-opt`  和  `--with-ld-opt`  明确指定路径,这是最标准、最不易出错的方法。

2.    检查版本兼容性:如果问题依旧,请确认你使用的GmSSL版本(v2或v3)与Nginx源码是否匹配。不匹配时,应考虑切换GmSSL版本或使用专用的Nginx分支。

3.    清理编译环境:在重试前,建议执行  `make  clean`  清理之前的编译产物,确保更改生效。