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 更安全
💡 我的习惯: 生产环境尽量用系统包管理器安装,别用源码编译。apt 安装的版本经过充分测试,安全补丁也跟得上。

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 报了一堆编译错误。说白了,开发头文件比运行时库更容易被忽略。

⚠️ 注意: 如果你之前装过 OpenSSL 1.1.1,升级到 3.0 后,旧的动态库可能还在。建议用 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 密钥对生成成功
工具链验证通过!
⚠️ 注意: 如果密钥对生成失败,多半是 OpenSSL 3.0 的底层算法被系统策略限制了。检查 /etc/ssl/openssl.cnf 里的 default_algorithms 配置。我遇到过 Ubuntu 22.04 默认禁用了部分算法,需要手动启用。

4.6 本章知识体系

下面这张图,帮你理清这三样东西的关系。说白了,OpenSSL 是底层引擎,Python 是调度中心,cryptography 是翻译官。

固件签名工具链环境架构 固件签名工具链环境架构 固件签名脚本 (Python 3.10) cryptography 库 (Python 封装) OpenSSL 3.0 (底层加密引擎) 调用关系:Python 脚本 → cryptography 库 → OpenSSL 3.0 原生 API

这张图你看懂了吗?从上到下,每一层都依赖下一层。Python 脚本调用 cryptography 库,cryptography 再调用 OpenSSL 3.0 的底层 API。如果中间任何一层断了,签名就做不了。