4. 环境准备:在 Ubuntu 22.04 上安装 OpenSSL 3.0、Python 3.10 及 cryptography 库
做固件签名,工具链就是你的武器库。我见过不少团队,签名脚本写得花里胡哨,结果底层 OpenSSL 版本不对,签名格式不兼容,折腾一整天。所以,咱们先把地基打牢。
这一章,我带你从零开始,在 Ubuntu 22.04 上搭好三样东西:OpenSSL 3.0、Python 3.10 和 cryptography 库。别小看这一步,后面所有签名、验签、证书管理都跑在这上面。
4.1 为什么选 Ubuntu 22.04?
你可能要问,为什么非用这个版本?
其实很简单。Ubuntu 22.04 LTS 是长期支持版,官方仓库里默认就是 OpenSSL 3.0 和 Python 3.10。你不需要从源码编译,省去很多麻烦。我在项目中踩过坑——用 Ubuntu 20.04 装 OpenSSL 1.1.1,后来升级到 3.0 时 ABI 不兼容,整个签名服务挂了半天。嗯,从那以后,我坚持用 LTS 最新版。
| 组件 | Ubuntu 22.04 默认版本 | 为什么选它 |
|---|---|---|
| OpenSSL | 3.0.x | 支持 Ed25519、更好的 FIPS 模块 |
| Python | 3.10.x | cryptography 库官方推荐,性能稳定 |
| cryptography | 最新 pip 版 | 封装了 OpenSSL 底层调用,API 更安全 |
4.2 安装 OpenSSL 3.0
Ubuntu 22.04 默认已经带了 OpenSSL 3.0。但保险起见,咱们先检查一下。
# 检查当前版本
openssl version
# 如果输出类似 "OpenSSL 3.0.2 15 Mar 2022",说明已经有了
# 如果没有,或者版本低于 3.0,执行:
sudo apt update
sudo apt install openssl libssl-dev -y
这里有个细节:libssl-dev 是开发库,后面编译 Python 的 cryptography 库时会用到。我刚开始做嵌入式安全时,就漏装了它,结果 pip install 报了一堆编译错误。说白了,开发头文件比运行时库更容易被忽略。
ldconfig -p | grep ssl 确认链接的是 3.0 版本。我曾经遇到过系统里同时存在两个版本,签名时调用了旧库,生成的签名格式不对。
4.3 安装 Python 3.10
Ubuntu 22.04 默认 Python 3 就是 3.10。但有时候系统里可能还留着 Python 3.8 或 3.9。我建议你单独创建一个虚拟环境,避免污染系统 Python。
# 检查 Python 版本
python3 --version
# 安装 pip 和 venv(如果还没有)
sudo apt install python3-pip python3-venv -y
# 创建一个独立的虚拟环境
python3 -m venv ~/firmware_signing_env
# 激活环境
source ~/firmware_signing_env/bin/activate
# 验证 Python 版本
python --version # 应该显示 Python 3.10.x
你想想看,为什么非要用虚拟环境?因为固件签名工具链可能依赖特定版本的库,比如 cryptography 的某个版本只支持 OpenSSL 3.0。如果你系统里还有其他 Python 项目,版本冲突会让你头疼。我个人习惯,每个项目一个虚拟环境,干净利落。
(firmware_signing_env)。如果没看到,说明没激活成功。后面所有 pip 安装都要在这个环境下进行。
4.4 安装 cryptography 库
cryptography 是 Python 生态里最成熟的加密库。它底层调用 OpenSSL,但提供了更 Pythonic 的 API。咱们直接 pip 安装。
# 确保虚拟环境已激活
pip install cryptography
# 验证安装
python -c "from cryptography.fernet import Fernet; print('cryptography 安装成功')"
# 查看版本
pip show cryptography
这里有个坑:cryptography 在安装时会编译本地扩展,依赖 OpenSSL 的开发头文件。如果你前面没装 libssl-dev,这里会报错。我曾经在 CI 环境里遇到过,pip install 卡了半小时,最后发现是 Docker 镜像里没装 OpenSSL 开发库。
| 常见错误 | 原因 | 解决办法 |
|---|---|---|
openssl/ssl.h: No such file or directory |
缺少 libssl-dev | sudo apt install libssl-dev |
Python.h: No such file or directory |
缺少 python3-dev | sudo apt install python3-dev |
No matching distribution found |
pip 版本太旧 | pip install --upgrade pip |
python -c "from cryptography.hazmat.backends import default_backend; print(default_backend())" 确认 cryptography 正确链接到了 OpenSSL 3.0。如果输出里包含 OpenSSL 3.0.x,就说明一切正常。
4.5 验证整个工具链
三样东西都装好了,咱们写个简单脚本,验证它们能不能协同工作。
# 创建测试文件
cat << 'EOF' > test_toolchain.py
import sys
import subprocess
# 检查 Python 版本
print(f"Python 版本: {sys.version}")
# 检查 OpenSSL 版本
result = subprocess.run(['openssl', 'version'], capture_output=True, text=True)
print(f"OpenSSL 版本: {result.stdout.strip()}")
# 检查 cryptography 版本
from cryptography import __version__ as crypto_version
print(f"cryptography 版本: {crypto_version}")
# 测试生成密钥对
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()
print("RSA 2048 密钥对生成成功")
print("工具链验证通过!")
EOF
# 运行测试
python test_toolchain.py
如果一切顺利,你会看到类似这样的输出:
Python 版本: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
OpenSSL 版本: OpenSSL 3.0.2 15 Mar 2022
cryptography 版本: 41.0.7
RSA 2048 密钥对生成成功
工具链验证通过!
/etc/ssl/openssl.cnf 里的 default_algorithms 配置。我遇到过 Ubuntu 22.04 默认禁用了部分算法,需要手动启用。
4.6 本章知识体系
下面这张图,帮你理清这三样东西的关系。说白了,OpenSSL 是底层引擎,Python 是调度中心,cryptography 是翻译官。
这张图你看懂了吗?从上到下,每一层都依赖下一层。Python 脚本调用 cryptography 库,cryptography 再调用 OpenSSL 3.0 的底层 API。如果中间任何一层断了,签名就做不了。