4. 开发环境搭建:安装OpenSSL、Python Cryptography库、GnuPG工具链
说实话,做固件签名这件事,工具链没搭好,后面全是坑。我见过太多人拿着现成的脚本跑,结果签名验签死活对不上,最后发现是OpenSSL版本不对,或者Python库装了个半残版。这一章,咱们就把这三样东西老老实实装好、配好。
你想想看,固件签名说白了就是三件事:算哈希、做非对称加密、管理密钥。OpenSSL负责底层密码运算,Python Cryptography库让我们能用代码调这些功能,GnuPG则管着密钥的生命周期。三样东西各司其职,缺一不可。
核心原则:所有工具尽量用包管理器安装,别从源码编译。除非你有特殊需求,否则编译OpenSSL那半小时纯属浪费生命。
4.1 OpenSSL:密码学工具箱
OpenSSL是固件签名的地基。哈希、RSA、ECDSA、X.509证书,全得靠它。我个人习惯装1.1.1系列或3.x LTS版本,别追新,稳定第一。
4.1.1 Linux环境安装
Ubuntu/Debian系,一行搞定:
sudo apt update
sudo apt install openssl libssl-dev
openssl version
CentOS/RHEL/Fedora:
sudo dnf install openssl openssl-devel
openssl version
装完跑一下 openssl version,看到类似 OpenSSL 1.1.1w 11 Sep 2023 就对了。
小经验:我在项目中遇到过,有些嵌入式Linux发行版默认装的是LibreSSL(比如Alpine)。LibreSSL虽然兼容大部分OpenSSL接口,但做固件签名时某些边缘行为不一样。建议统一用OpenSSL,省得后面排查到怀疑人生。
4.1.2 macOS环境安装
macOS自带的OpenSSL版本太老,别用。用Homebrew装新的:
brew install openssl
echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
openssl version
4.1.3 Windows环境安装
Windows稍微麻烦点。我建议用vcpkg或者直接下载预编译二进制包:
- 去 Win32 OpenSSL 下载安装包(选Light版就行)
- 安装时勾选「Copy OpenSSL DLLs to /bin directory」
- 把安装目录下的
bin\加到系统PATH里 - 打开CMD跑
openssl version验证
注意:Windows下OpenSSL有Win32和Win64两个版本,别装混了。我见过有人64位系统装了32位版本,Python调用时直接报错找不到库。
4.2 Python Cryptography库:代码级签名能力
OpenSSL是命令行工具,但咱们做自动化签名脚本时,得用Python调它的能力。cryptography 库就是干这个的。它封装了OpenSSL的底层接口,用起来比直接调 ctypes 舒服一百倍。
4.2.1 安装cryptography
用pip装,干净利落:
pip install cryptography
如果你在虚拟环境里干活(我强烈建议这么做),先建个环境再装:
python3 -m venv fw_sign_env
source fw_sign_env/bin/activate
pip install cryptography
4.2.2 验证安装
写个简单脚本测试一下:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
# 生成一个测试密钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 导出公钥
public_key = private_key.public_key()
pub_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print("RSA密钥生成成功!")
print(pub_pem.decode()[:200])
跑一下,看到输出就说明环境通了。
避坑指南:我曾经在ARM架构的树莓派上装cryptography,结果编译报错。原因是缺少 libffi-dev 和 pkg-config。如果你也遇到类似问题,先装依赖:sudo apt install libffi-dev pkg-config,再重装pip包。
4.3 GnuPG工具链:密钥管理与分发
OpenSSL管密码运算,GnuPG管密钥信任链。做固件签名时,你得有个靠谱的方式存私钥、分公钥。GnuPG的密钥环机制正好干这个。
4.3.1 安装GnuPG
Linux:
sudo apt install gnupg
gpg --version
macOS:
brew install gnupg
gpg --version
Windows:去 GnuPG官网 下载Gpg4win安装包,一路Next就行。
4.3.2 初始化密钥环
装完后,先初始化一下:
gpg --list-keys
如果提示 gpg: directory '/home/you/.gnupg' created,说明第一次运行,目录自动建好了。
4.3.3 生成测试密钥对
咱们先搞一对测试密钥,后面章节会用到:
gpg --batch --gen-key <<EOF
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: Firmware Signing Test Key
Name-Email: fw-sign@example.com
Expire-Date: 0
%no-protection
%commit
EOF
跑完后,用 gpg --list-keys 看看,应该能看到新生成的密钥。
安全提醒:上面这个命令用了 %no-protection,意思是私钥没设密码。这只是测试用!生产环境千万别这么干。生产环境一定要设强密码,并且把私钥放在HSM或安全芯片里。
4.4 工具链关系全景图
这三样东西怎么配合?我画了张图,你看一眼就明白了:
4.5 环境验证清单
装完别急着走,跑一遍这个清单,确保每样东西都能用:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| OpenSSL版本 | openssl version |
显示 1.1.1 或 3.x |
| Python Cryptography | python -c "import cryptography; print(cryptography.__version__)" |
显示版本号(如 41.0.7) |
| GnuPG版本 | gpg --version |
显示 2.2.x 或 2.4.x |
| 密钥生成 | gpg --list-keys |
能看到刚才生成的测试密钥 |
| RSA签名测试 | echo "test" | openssl dgst -sha256 -sign /dev/null 2>&1 |
报错但能看到OpenSSL正常加载 |
我的习惯:每次搭完环境,我会写一个 check_env.sh 脚本,把这几个检查项串起来。后面换机器或者重装系统时,跑一遍脚本就知道环境有没有问题。省得等到签名失败才回头查工具链。
4.6 常见问题与解决
搭环境总会遇到点幺蛾子。我列几个高频问题:
- Python找不到cryptography模块——多半是pip装到了系统Python,而你用的是虚拟环境。检查一下
which python和pip list是不是同一个环境。 - OpenSSL版本太旧——Ubuntu 18.04默认是1.1.0,有些API不一样。建议升级到1.1.1或直接上3.x。
- GnuPG报错 "gpg: can't connect to the agent"——杀掉gpg-agent进程让它重启:
gpgconf --kill gpg-agent。 - Windows下Python调用OpenSSL报DLL加载失败——把OpenSSL的
bin\目录加到PATH,或者把libcrypto-3-x64.dll和libssl-3-x64.dll复制到Python的DLLs\目录下。
嗯,环境搭到这步,基本就齐活了。后面咱们就可以拿这些工具真刀真枪地干签名和验签了。