编译安装国密版 OpenSSL(GmSSL)整体上不复杂,但关键是要避免与系统自带的 OpenSSL 发生冲突。下面为用户写一下完整的流程,尤其包含了 “与系统 OpenSSL 共存”这一关键的兼容性方案。
一、准备工作:安装依赖
首先,你需要安装编译所需的工具和库。
Debian/Ubuntu 系列:
bash
sudo apt update
sudo apt install -y git gcc g++ make cmake libtool autoconf
Red Hat/CentOS 系列:
bash
sudo yum install -y git gcc gcc-c++ make cmake libtool autoconf
为了与系统自带的 OpenSSL 隔离,建议安装 `libssl-dev`(Debian/Ubuntu)或 `openssl-devel`(CentOS/RHEL),但后续编译 GmSSL 时会通过 `--prefix` 参数指定独立安装路径。
二、编译安装:从源码到系统
完成依赖准备后,就可以开始编译安装了。
1. 获取源码:
bash
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
2. 配置编译选项:
GmSSL 3.0 以后主要使用 CMake 进行构建。以下是关键的配置参数,尤其注意 `CMAKE_INSTALL_PREFIX` 用于指定独立安装路径,以避免与系统 OpenSSL 冲突。
bash
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/gmssl \
-DBUILD_SHARED_LIBS=ON \
-DENABLE_SM3_AVX_BMI2=ON \
-DENABLE_SM4_AESNI_AVX=ON
`CMAKE_INSTALL_PREFIX`: 指定安装根目录。设置为 `/usr/local/gmssl` 可以将所有 GmSSL 相关文件(`bin`, `lib`, `include`)都装在这个独立文件夹下。
`BUILD_SHARED_LIBS`: 设为 `ON` 生成动态库(`.so` 文件),方便程序链接。
`ENABLE_SM3_AVX_BMI2` / `ENABLE_SM4_AESNI_AVX`: 如果你的 CPU 支持这些指令集,开启后能获得更好的性能。
更多选项:GmSSL 也保留了 OpenSSL 传统的 `./config` 配置方式,其参数风格类似,例如 `--openssldir` 可指定 OpenSSL 配置目录。
3. 编译与安装:
bash
make -j$(nproc) # -j$(nproc) 用于加速编译,充分利用CPU核心
make test # 强烈建议运行,确保编译出的库功能正常
sudo make install
三、验证与配置:确保安装成功
安装完成后,进行验证和配置。
1. 测试命令行工具:
直接调用刚安装的 `gmssl` 程序来检查版本。
bash
/usr/local/gmssl/bin/gmssl version
如果能看到类似 `GmSSL 3.0.0-dev` 的版本信息,说明编译和安装基本成功。
2. 配置动态库路径:
为了让系统能找到 GmSSL 的动态库(`libcrypto.so` 等),需要配置链接器。
创建配置文件:
bash
sudo bash -c 'echo "/usr/local/gmssl/lib" > /etc/ld.so.conf.d/gmssl.conf'
更新缓存:
```bash
sudo ldconfig
四、兼容性处理:与系统 OpenSSL 共存之道
这是最关键的一步。GmSSL 生成的动态库文件名与系统 OpenSSL 完全相同(都是 `libcrypto.so` 和 `libssl.so`),直接替换会导致系统严重依赖问题。因此,绝对不要使用默认的 `/usr/local` 或 `/usr` 路径。
我们通过上述的 `CMAKE_INSTALL_PREFIX=/usr/local/gmssl` 将所有 GmSSL 文件隔离,使用时有两种方法:
临时环境变量:在需要使用的终端会话中设置 `PATH` 和 `LD_LIBRARY_PATH`。
应用显式指定:在编译你自己的程序时,通过 `-I` 和 `-L` 参数显式指定头文件和库文件路径。
五、进阶配置:按需启用功能
开启性能测试:若需测试算法性能,在 CMake 配置阶段加上 `-DENABLE_TEST_SPEED=ON`,安装后可在 `/usr/local/gmssl/bin/` 下找到 `sm4test`、`sm3test` 等测试工具。
Java 接口支持:默认不编译 Java 接口,需要修改源码根目录下的 `Configure` 文件,将 `java` 目录添加到 `$config{dirs}` 数组中,然后重新编译。
交叉编译:GmSSL 官方文档提供了为 Android 和 iOS 等平台交叉编译的脚本,需要预先配置好对应的 SDK/NDK 环境。
硬件加速:在 CMake 配置阶段,你可以通过启用 `-DENABLE_SM3_AVX_BMI2` 和 `-DENABLE_SM4_AESNI_AVX` 等选项,为支持相关指令集的 CPU 开启硬件加速,显著提升 SM3 和 SM4 算法的性能。
构建与打包:GmSSL 利用 CPack 系统可以生成适用于不同 Linux 发行版的原生软件包(如 `.deb` 或 `.rpm`)。编译完成后,在 `build` 目录下执行 `cpack` 即可。
六、故障排查:常见问题
编译错误:通常是因为依赖缺失。请确认 `cmake`, `gcc`, `make` 等工具已正确安装,并尝试删除 `build` 目录后重新配置。
`gmssl: command not found`:说明 `/usr/local/gmssl/bin` 不在你的 `PATH` 环境变量中。运行 `export PATH=/usr/local/gmssl/bin:$PATH` 可临时解决,或将其写入 `~/.bashrc` 永久生效。
`error while loading shared libraries`:系统找不到 `.so` 文件。请确保已正确创建 `/etc/ld.so.conf.d/gmssl.conf` 文件并执行了 `sudo ldconfig` 命令。