4. 开发环境搭建:OpenSSL、GmSSL、PBC库安装、VS Code与Python环境配置
说实话,搞密码学开发,环境搭建往往是最磨人的一步。
很多人一上来就急着写代码,结果编译不过,缺库、缺头文件、版本冲突……折腾半天连 Hello World 都没跑起来。
我个人习惯是:先把地基打牢。工具链装好、库装对、IDE 配明白,后面写代码就顺手多了。
这一章,我就带你手把手搞定整套开发环境。我们接下来要实操 RSA 替换 SM2,所以这几个东西必须装:
- OpenSSL —— 全球通用的密码学工具箱,我们拿它做 RSA 基准测试和参考对比。
- GmSSL —— 国密标准的开源实现,SM2 系列算法就靠它。
- PBC 库 —— 双线性配对运算的底层依赖,SM9 以及部分高级密码方案会用到。
- VS Code + Python —— 日常开发环境和快速验证脚本语言。
我曾经在同一台机器上装了多个版本的 OpenSSL,结果 GmSSL 编译时死活找不到正确的头文件。你想想看,一个符号冲突就能卡你半天。所以我的建议是:尽量用包管理器安装,或者严格指定安装路径,别偷懒。
4.1 操作系统与基础工具准备
说白了,后面的步骤大部分是在 Linux 终端里完成的。我选 Ubuntu 22.04 LTS,生态比较友好。
先确认基础编译工具链已装好:
sudo apt update
sudo apt install build-essential cmake git wget
嗯,这一步没什么技术含量,但容易忘。我每次重装系统后第一件事就是跑这三行。
4.2 OpenSSL 安装
为什么先装它?因为 GmSSL 编译时有可能依赖 OpenSSL 的某些底层函数。另外我们后面做性能对比,也需要拿 OpenSSL 的 SM2 实现(虽然它是实验性的)来做参照。
安装方式一:用包管理器(推荐)
sudo apt install libssl-dev openssl
openssl version # 验证安装
安装方式二:源码编译(如果你需要特定版本)
wget https://www.openssl.org/source/openssl-3.0.13.tar.gz
tar -xzf openssl-3.0.13.tar.gz
cd openssl-3.0.13
./config --prefix=/usr/local/openssl-3.0
make -j$(nproc)
sudo make install
如果你源码编译,记得加
--prefix 指定独立目录。我之前直接用默认路径,结果和系统自带的 OpenSSL 打架,编译 GmSSL 时各种找不到符号,折腾了大半天。
4.3 GmSSL 编译与安装
GmSSL 是国密的核心库。它支持 SM2/SM3/SM4/SM9,接口风格和 OpenSSL 很像,但底层实现完全不一样。
你机器上必须已经装好了 OpenSSL 的 dev 包(或者指定了头文件路径)。
我 recommend 的做法:
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/gmssl ..
make -j$(nproc)
sudo make install
编译完成之后,记得把动态库路径加到环境变量里:
export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH
echo 'export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
如果不加这个环境变量,你运行 GmSSL 程序时会报
cannot find libgmssl.so。我当初第一次编译完就忘了,心里还嘀咕“明明装了啊,怎么找不到库?”。嗯,血的教训。
4.4 PBC 库安装
PBC(Pairing-Based Cryptography)库是双线性配对运算的核心。虽然我们的主战场是 SM2,但证书链验证、SM9 这类高级功能会用到它。
这个库的依赖比较轻,但需要 flex 和 bison(词法/语法分析器)。
sudo apt install flex bison
wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
tar -xzf pbc-0.5.14.tar.gz
cd pbc-0.5.14
./configure --prefix=/usr/local/pbc
make -j$(nproc)
sudo make install
装完后同样加一下库路径:
export LD_LIBRARY_PATH=/usr/local/pbc/lib:$LD_LIBRARY_PATH
4.5 VS Code 配置
编辑器我推荐 VS Code,插件生态好,调试方便。
你安装好 VS Code 后,建议装上这几个插件:
- C/C++(微软官方)—— 语法高亮、IntelliSense
- CMake Tools —— CMake 项目一键构建
- Python —— 如果你打算用 Python 脚本辅助验证
- Code Runner —— 快速运行单个文件
我个人习惯在 VS Code 里打开一个独立的工作区,把 GmSSL、OpenSSL 的头文件路径配进 .vscode/c_cpp_properties.json,这样写代码时能自动补全:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/gmssl/include",
"/usr/local/openssl-3.0/include",
"/usr/local/pbc/include"
]
}
]
}
4.6 Python 环境与绑定库
为什么需要 Python?说白了,快速原型验证。SM2 签名、验签的逻辑用 C 写一遍可能很费劲,但用 Python 调封装好的库,几行代码就能跑通。等 Python 版本验证通过了,再移植到 C 项目里,大大降低调试成本。
安装 Python 及常用密码学库:
sudo apt install python3 python3-pip
pip3 install pycryptodome # 支持 SM2/SM3/SM4 的 Python 库
pip3 install gmssl-python # 另一个国密 Python 绑定(可选)
验证一下 Python 环境能否正常导入:
python3 -c "from Crypto.PublicKey import ECC; print('ECC module OK')"
python3 -c "from gmssl import sm2; print('GmSSL Python binding OK')"
我做过的几个信创迁移项目,最终生产代码都是 C/C++ 写的(性能要求高),但在算法调试和测试用例构造阶段,90% 的工作都是在 Python 里完成的。你想想看,改一行代码不用重新编译,多爽。
4.7 验证环境是否完整
装完这些东西,我建议你一口气跑一个综合测试,确保所有组件都能正常工作:
- OpenSSL 命令行能生成 RSA 密钥对
- GmSSL 命令行能生成 SM2 密钥对
- PBC 库的 demo 程序能编译通过并运行
- Python 中能调用 sm2 库签名/验签
具体命令我这里不啰嗦了,后面几章实操时会反复用到。你现在只需要确认:安装过程中没有报错,库路径都配上了。
不要追求“一次装完再也不动”。密码学库更新频繁,版本之间 API 可能不兼容。我个人习惯是:每个项目建一个独立的环境(Docker 或 conda),把依赖版本固化。这样既能复现,又不会污染系统。
4.8 本章完整环境链一览
下面这张图总结了整个环境搭建的知识脉络:
4.9 常见问题速查
最后,我把安装过程中最容易踩的坑整理成一张表,你遇到问题时先来这里找答案:
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| openssl version 找不到命令 | 未安装或 PATH 未更新 | sudo apt install openssl |
| GmSSL 编译报错:找不到 openssl/evp.h | libssl-dev 未安装 | sudo apt install libssl-dev |
| 运行 GmSSL 程序报 cannot find libgmssl.so | LD_LIBRARY_PATH 未设置 | 按 4.3 节补全环境变量 |
| PBC 编译时卡在 syntax error | 未安装 flex/bison | sudo apt install flex bison |
| Python 导入 gmssl 模块失败 | pip 安装的库版本不对 | 用 pip3 install gmssl-python |
环境搭建这一步没有捷径。你跟着上面的步骤走,每装完一个库就验证一下,少跳步。等这些基础库都跑通了,后面写 SM2 替换 RSA 的代码时才能行云流水。
我这边的习惯是把完整的安装脚本写成一个 setup_env.sh,每次重装系统或者换机器,直接跑脚本一键部署。你也可以试试这种做法,能省不少时间。