3. 测试环境搭建:操作系统选择、国密库安装与编译

到了第三章,咱们得把真正干活的环境搭起来。
说实话,很多人在国密接口测试上栽跟头,不是不会写代码,而是环境先没搞对。
我个人习惯是先想清楚用哪个系统、装哪个库,再去动手。不然装到一半发现依赖冲突,那才叫头疼。

3.1 操作系统选择——别小看这一步

国密环境对操作系统其实有隐形的偏好。
你想想看,如果你用的是 Windows,后面编译 GMSSL 的坑会多到你怀疑人生。
我建议优先选 Linux,最好是 CentOS 7.x 或 Ubuntu 20.04 LTS。
为什么?

操作系统 适合程度 常见问题
CentOS 7.9 ★★★★★ 依赖库稳定,跟生产环境一致
Ubuntu 20.04 ★★★★☆ 包更新快,但部分国密库需要手动打补丁
银河麒麟 ★★★★☆ 原生支持国密,但社区资源少
Windows 10/11 ★★☆☆☆ 编译环境难配,动态库兼容性差
我的经验是: 如果你只是做接口兼容性测试,Ubuntu 20.04 是最省心的。我在项目里遇到过一次,甲方要求用某国产系统,结果 GMSSL 编译链缺了三个关键补丁……嗯,最后还是切回 Ubuntu 才跑通的。

3.2 编译器与基础依赖准备

装国密库之前,先把编译器搞定。
说白了,就是 gcc、g++、make、cmake 这几个。

我在 Ubuntu 上的标准操作:

sudo apt update
sudo apt install -y build-essential cmake git libssl-dev

如果是 CentOS:

sudo yum groupinstall -y "Development Tools"
sudo yum install -y cmake openssl-devel
这里有个坑: 系统自带的 libssl-dev 通常是非国密版本,不影响编译,但测试结果别跟国密混为一谈。

3.3 GMSSL 的安装与编译

GMSSL 是国密生态里最常用的开源库。
我最早接触国密项目时,就是被 GMSSL 折腾了一整天,后来发现是版本选错了。

步骤其实不复杂:

  1. 从 GitHub 拉代码
  2. 切到稳定分支
  3. 执行传统三件套:./config、make、make install

具体命令:

git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
git checkout master
./config
make -j$(nproc)
sudo make install

我这里多说一句:./config 的时候,建议加上 --prefix=/usr/local/gmssl。
为什么?方便后面多版本共存,也方便卸载。
你想想看,万一你后面要测 OpenSSL 国密模块,两个库装在一起,没分开目录那不乱套了吗?

注意: GMSSL 默认安装路径可能跟系统 OpenSSL 冲突。我曾经因为没指定路径,结果系统里 openssl 命令被 GMSSL 替换了,导致一堆服务起不来……那叫一个惨。

3.4 OpenSSL 国密模块——另一种选择

除了 GMSSL,OpenSSL 从 1.1.1 开始也支持国密了。
但它默认不开启,需要手动编译时加上 enable-ec_nistp_64_gcc_128 和 enable-sm2、enable-sm3、enable-sm4 这些参数。
我个人习惯用 GMSSL 做主测试,OpenSSL 国密模块做交叉验证。

编译 OpenSSL 国密模块的命令:

wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config enable-sm2 enable-sm3 enable-sm4 \
  --prefix=/usr/local/openssl-gm
make -j$(nproc)
sudo make install
小技巧: 可以在 ~/.bashrc 里加个别名,方便在两个库之间切换:
alias gmssl='LD_LIBRARY_PATH=/usr/local/gmssl/lib /usr/local/gmssl/bin/gmssl'
alias openssl-gm='LD_LIBRARY_PATH=/usr/local/openssl-gm/lib /usr/local/openssl-gm/bin/openssl'
这样一来,测试时直接敲 gmssl 或 openssl-gm 就行了。

3.5 验证安装是否成功

装完别急着跑。先验证一下。
我通常用这三条命令:

  • 验证 SM2 可用: gmssl sm2keygen -pass 1234 -out sm2.pem
  • 验证 SM3 哈希: echo -n "abc" | gmssl sm3
  • 验证 SM4 加解密: gmssl sm4 -e -in plain.txt -out cipher.bin -key 0123456789abcdeffedcba9876543210

如果你能顺利跑出结果,那环境就算搭好了。
如果报错说找不到 libssl.so 什么的,八成是动态库路径没配。
解决方法:export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH

曾经掉过的坑: 有一次我执行 sm4 -e 一直报错,查了半天发现是密钥长度写错了。SM4 密钥必须是 16 字节十六进制串,少一位都不行。嗯,这种细节后面测试的时候会反复踩。

3.6 本章核心知识结构

我把整章内容整理成一张图,方便你对照着搭环境:

国密测试环境搭建核心流程 国密测试环境搭建核心流程 操作系统选择 Ubuntu 20.04 LTS CentOS 7.9 银河麒麟 编译器与基础依赖安装 (gcc, make, cmake) GMSSL 编译安装 OpenSSL 国密模块编译 验证测试:SM2 密钥生成 / SM3 哈希 / SM4 加解密 环境可用 ✓ 进入接口兼容性测试实战 图中双库选其一即可,建议 GMSSL 为主、OpenSSL 国密模块为辅做交叉验证

嗯,到这步,你的测试环境基本就绪了。
后面章节开始,我们就要用这个环境去真刀真枪地测接口了。
记住:环境搭建越仔细,后面踩坑越少。别急着跳步骤,稳住。