2. 国密算法基础环境搭建:OpenSSL国密模块编译、GmSSL库安装、Python国密库安装
说实话,搞国密开发最头疼的往往不是算法本身,而是环境搭不起来。我见过太多人卡在编译这一步,折腾两天最后放弃了。这一章咱们就把基础环境彻底搞定——OpenSSL 国密模块、GmSSL 库、还有 Python 那边的 pysmx 和 gmssl-python,一个一个来。
你想想看,如果连环境都跑不通,后面那些权限隔离、启动校验全是空谈。所以这一章我建议你跟着我一步步操作,别跳步骤。我当年第一次编译 OpenSSL 国密模块时,就因为少装了一个依赖,硬是排查了三个小时。
本章核心目标:完成三套国密运行环境的搭建,确保 SM2/SM3/SM4 算法在 C 语言和 Python 层面均可正常调用。
2.1 环境概览与版本选择
先看一张整体架构图,帮你建立全局认知:
这张图其实就说明了一件事:Python 国密库底层调的是 C 库,C 库又依赖操作系统的密码学基础设施。所以咱们的搭建顺序是——先编译 OpenSSL 国密模块,再装 GmSSL,最后装 Python 库。
| 组件 | 版本建议 | 用途 |
|---|---|---|
| OpenSSL | 1.1.1 系列(带国密补丁) | 提供 SM2/SM3/SM4 底层 C 接口 |
| GmSSL | GmSSL-3.x | 纯国密实现,兼容性更好 |
| pysmx | 最新版 | Python 调用 SM2/SM3/SM4 |
| gmssl-python | 最新版 | Python 调用 GmSSL 封装 |
我的建议:如果你是在生产环境用,优先选 GmSSL + gmssl-python 这套组合。OpenSSL 国密模块虽然也能用,但补丁维护不太积极,我遇到过几次版本兼容问题。
2.2 OpenSSL 国密模块编译
OpenSSL 官方主线其实没有直接集成国密算法,需要打补丁。国内用得比较多的是铜锁(Tongsuo)这个分支,或者自己从源码编译带国密补丁的版本。
我个人习惯用铜锁,因为它把国密算法直接集成进去了,不用额外打补丁。下面是我在 Ubuntu 20.04 上的操作记录:
# 安装编译依赖
sudo apt-get update
sudo apt-get install -y build-essential git perl zlib1g-dev
# 克隆铜锁源码
git clone https://github.com/Tongsuo-Project/Tongsuo.git
cd Tongsuo
# 切换到稳定分支
git checkout stable-1.1.1
# 配置编译选项,启用国密模块
./config \
--prefix=/usr/local/tongsuo \
--openssldir=/usr/local/tongsuo/ssl \
enable-ec_nistp_64_gcc_128 \
enable-sm2 \
enable-sm3 \
enable-sm4 \
enable-sm9 \
zlib
# 编译(建议用 -j 参数加速)
make -j$(nproc)
# 安装
sudo make install
# 验证安装
/usr/local/tongsuo/bin/openssl version
# 输出示例:OpenSSL 1.1.1w 11 Sep 2023 (Tongsuo)
注意:编译时一定要加上 enable-sm2 enable-sm3 enable-sm4 这三个参数,否则编译出来的 OpenSSL 不包含国密算法。我曾经帮一个同事排查问题,他编译了三遍都没加上这些参数,白白浪费了半天时间。
编译完成后,可以用下面这条命令测试 SM3 哈希是否正常:
echo -n "hello, 国密" | /usr/local/tongsuo/bin/openssl dgst -sm3
# 输出示例:SM3(stdin)= 8c7e6a1c...(一串十六进制)
如果能看到 SM3 的哈希值输出,说明国密模块已经编译成功了。
2.3 GmSSL 库安装
GmSSL 是北京大学开源的一个国密实现,比 OpenSSL 补丁版更纯粹。它原生支持 SM2/SM3/SM4/SM9/ZUC 等国密算法,而且 API 设计更贴近国密标准。
我推荐用 GmSSL 3.x 版本,代码结构比 2.x 清晰很多。安装过程如下:
# 克隆 GmSSL 源码
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
# 切换到 3.x 分支
git checkout master
# 创建构建目录
mkdir build
cd build
# CMake 配置
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/gmssl \
-DCMAKE_BUILD_TYPE=Release
# 编译
make -j$(nproc)
# 安装
sudo make install
# 配置动态库路径
sudo sh -c "echo '/usr/local/gmssl/lib' > /etc/ld.so.conf.d/gmssl.conf"
sudo ldconfig
# 验证安装
/usr/local/gmssl/bin/gmssl version
# 输出示例:GmSSL 3.1.0
避坑指南:GmSSL 3.x 默认安装路径是 /usr/local/gmssl,和系统自带的 OpenSSL 不会冲突。但如果你之前装过 GmSSL 2.x,记得先卸载干净,否则两个版本混在一起会出各种奇怪的问题。我就在这上面栽过跟头。
验证 SM4 加密是否正常:
# 生成 SM4 密钥
/usr/local/gmssl/bin/gmssl sm4 -genkey -out sm4.key
# 加密文件
echo "国密算法测试" > test.txt
/usr/local/gmssl/bin/gmssl sm4 -encrypt -in test.txt -out test.enc -key sm4.key
# 解密文件
/usr/local/gmssl/bin/gmssl sm4 -decrypt -in test.enc -out test.dec -key sm4.key
# 对比原文
cat test.dec
# 输出:国密算法测试
2.4 Python 国密库安装
Python 这边有两个主流选择:pysmx 和 gmssl-python。它们各有侧重,我一般根据项目需求来选。
| 对比项 | pysmx | gmssl-python |
|---|---|---|
| 底层依赖 | 纯 Python 实现 | 调用 GmSSL C 库 |
| 性能 | 中等(纯 Python 计算) | 高(C 扩展) |
| 安装难度 | 简单(pip 直接装) | 需要先装 GmSSL |
| 适用场景 | 快速原型、小数据量 | 生产环境、高性能要求 |
2.4.1 安装 pysmx
pysmx 是纯 Python 实现,不依赖任何 C 库。安装非常简单:
# 使用 pip 直接安装
pip install pysmx
# 验证安装
python -c "from pysmx.SM3 import SM3; print('pysmx installed successfully')"
写个简单的 SM3 哈希测试:
from pysmx.SM3 import SM3
sm3 = SM3()
sm3.update(b"hello, 国密")
digest = sm3.hexdigest()
print(f"SM3 Hash: {digest}")
# 输出示例:SM3 Hash: 8c7e6a1c...
我的经验:pysmx 适合做快速验证和教学场景。但如果你要处理大量数据(比如每秒几千次签名),建议用 gmssl-python,性能差距能到 10 倍以上。
2.4.2 安装 gmssl-python
gmssl-python 是 GmSSL 的 Python 封装,需要先确保 GmSSL C 库已经安装好(2.3 节的内容)。
# 安装 gmssl-python
pip install gmssl-python
# 验证安装
python -c "import gmssl; print(gmssl.__version__)"
测试 SM2 签名:
from gmssl import sm2
# 生成 SM2 密钥对
private_key, public_key = sm2.generate_keypair()
# 待签名数据
data = b"国密启动校验数据"
# 签名
signature = sm2.sign(private_key, data)
print(f"SM2 Signature: {signature.hex()}")
# 验签
is_valid = sm2.verify(public_key, data, signature)
print(f"Verify Result: {is_valid}")
# 输出:Verify Result: True
重要提醒:gmssl-python 在安装时会自动查找系统里的 GmSSL 动态库。如果找不到,会报 ImportError: libgmssl.so 之类的错误。这时候检查两件事:一是 GmSSL 是否真的装好了,二是 ldconfig 是否刷新了库路径。我遇到过好几次都是因为忘了执行 sudo ldconfig。
2.5 环境验证清单
所有组件安装完成后,建议跑一遍完整的验证脚本。我整理了一个检查清单:
- OpenSSL 国密模块:
openssl dgst -sm3能否正常计算 SM3 哈希 - GmSSL:
gmssl sm4 -encrypt能否正常加解密 - pysmx:Python 中能否导入
pysmx.SM3并计算哈希 - gmssl-python:Python 中能否导入
gmssl.sm2并完成签名验签
把这四项都跑通,你的国密基础环境就算搭建完成了。后面章节的所有实战内容,都会基于这套环境来展开。
最终确认:如果你能同时跑通上面四个验证点,恭喜你,国密开发环境已经就绪。接下来我们就可以进入真正的权限隔离与启动校验实战了。