4. OpenSSL 与 GMSSL:从国际到国密的桥梁
说到密码学工具,OpenSSL 几乎是绕不开的存在。我入行那会儿,最头疼的就是记那些长长的命令行参数。但用久了你会发现,它其实就是个瑞士军刀——功能全,但得知道怎么用。
这一节,我们聊聊 OpenSSL 是什么,再重点看看它的国密分支 GMSSL 怎么装、怎么用。嗯,这部分内容,我建议你跟着动手敲一遍。
4.1 OpenSSL 简介:密码学界的“Linux”
OpenSSL 是个开源的密码学工具包。它实现了 SSL/TLS 协议,也提供了各种对称加密、非对称加密、哈希算法、数字证书操作的能力。
说白了,你在网上看到的 HTTPS 小锁,背后基本都是 OpenSSL 在干活。它支持 RSA、DSA、ECDSA 这些国际算法,也支持 X.509 证书的生成和解析。
但有个问题——它原生不支持国密 SM2/SM3/SM4。你想想看,国内做等保、做密评,必须用国密算法。这时候,OpenSSL 就有点力不从心了。
核心区别: OpenSSL 是国际算法的标准实现;GMSSL 是国密算法的标准实现。两者 API 兼容,但算法套件不同。
4.2 GMSSL 国密分支:为什么需要它?
GMSSL 是 OpenSSL 的一个国密分支。它保留了 OpenSSL 的架构和命令行接口,但把核心算法换成了 SM2、SM3、SM4。
我记得 2018 年做第一个国密项目时,市面上还没有成熟的 GMSSL 版本。我们只能自己给 OpenSSL 打补丁,那叫一个痛苦。现在好多了,GMSSL 已经发展到了 2.x 版本,稳定性不错。
GMSSL 主要解决了三个问题:
- 算法支持: 原生支持 SM2 签名/加密、SM3 哈希、SM4 对称加密
- 证书兼容: 支持国密证书的生成、解析、验证
- 协议适配: 支持国密 SSL 握手协议(TLCP)
我的建议: 如果你只是做国密证书的生成和测试,GMSSL 2.x 就够用了。如果要做生产环境部署,建议用经过国密局认证的商用版本。
4.3 GMSSL 安装:从源码编译到验证
安装 GMSSL 有两种方式:一是直接用包管理器(部分 Linux 发行版已收录),二是从源码编译。我个人习惯用源码编译,因为可以控制编译选项。
下面是我常用的编译步骤:
# 1. 下载源码
wget https://github.com/guanzhi/GmSSL/archive/refs/tags/v2.5.4.tar.gz
tar -xzf v2.5.4.tar.gz
cd GmSSL-2.5.4
# 2. 配置编译选项
./config --prefix=/usr/local/gmssl
# 3. 编译(建议用 -j 参数加速)
make -j4
# 4. 安装
sudo make install
# 5. 验证安装
/usr/local/gmssl/bin/gmssl version
我曾经在 CentOS 7 上编译时遇到过一个问题——缺少 Perl 模块。嗯,这里要注意,编译前确保系统装了 perl 和 make。
避坑指南: 我曾经在 Ubuntu 20.04 上编译 GMSSL 2.5.4 时,因为系统自带的 OpenSSL 版本冲突,导致编译失败。解决办法是:编译时指定 --with-openssl=no,让 GMSSL 使用内置的加密库。
4.4 命令行工具初探:用 gmssl 做点实事
装好之后,我们来试试几个常用命令。GMSSL 的命令行接口和 OpenSSL 几乎一样,只是算法名称换成了国密。
4.4.1 查看版本和帮助
# 查看版本
gmssl version
# 查看支持的算法
gmssl list -digest-commands
gmssl list -cipher-commands
你会看到 SM3、SM4 这些国密算法已经在了。我当初第一次看到 SM2 出现在列表里时,还挺激动的。
4.4.2 生成 SM2 密钥对
这是最常用的操作。SM2 密钥对生成方式和 ECDSA 类似,但曲线是固定的。
# 生成 SM2 私钥(PEM 格式)
gmssl ecparam -genkey -name sm2p256v1 -out sm2_private.pem
# 从私钥导出公钥
gmssl ec -in sm2_private.pem -pubout -out sm2_public.pem
# 查看密钥信息
gmssl ec -in sm2_private.pem -text -noout
小技巧: 用 -text -noout 可以查看密钥的详细参数,比如曲线点坐标。调试时很有用。
4.4.3 计算 SM3 哈希
SM3 是国密哈希算法,输出 256 位摘要。用法和 SHA-256 一样。
# 计算文件的 SM3 哈希
echo "hello, gmssl" | gmssl sm3
# 计算文件的 SM3 哈希
gmssl sm3 myfile.txt
4.4.4 SM4 对称加解密
SM4 是国密对称加密算法,分组长度 128 位,密钥长度 128 位。
# 生成随机 SM4 密钥
gmssl rand -hex 16 > sm4.key
# 加密文件(CBC 模式)
gmssl sms4 -in plain.txt -out cipher.bin -K $(cat sm4.key) -iv 0123456789abcdef
# 解密文件
gmssl sms4 -d -in cipher.bin -out decrypted.txt -K $(cat sm4.key) -iv 0123456789abcdef
注意: SM4 的密钥和 IV 都是 16 字节(128 位)。IV 不要重复使用,否则安全性会大打折扣。我曾经在测试时偷懒用了固定 IV,被安全审计的老师傅批评了。
4.5 知识体系总览:一张图看懂
下面这张图,把 OpenSSL、GMSSL 和国密算法的关系梳理清楚了。我建议你保存下来,后面几章会反复用到。
4.6 本章小结:你该记住什么
这一节的内容,说白了就是两件事:
- GMSSL 是 OpenSSL 的国密版本,命令行用法几乎一样,但算法换成了 SM2/SM3/SM4
- 安装要小心环境冲突,我建议用源码编译,并指定独立安装路径
- 命令行工具很强大,密钥生成、哈希计算、对称加解密都能搞定