乐鑫 ESP32 系列芯片均采用安全启动机制,确保只有可信任固件能够在 flash 中运行。然而,这种机制要求小心管理签名密钥,即签名密钥必须由签名实体以安全的方式生成和存储。
外部 (硬件安全模块)是一种专门用于保护和管理密钥的加密设备。它还可以提供专业的加密服务,如明文加密、数字签名等。现在,许多云服务都提供使用基于云 HSM 的解决方案
外部 HSM 提供了一个基于 PKCS #11 标准的加密接口,可实现对固件进行签名及其他功能。通过 PKCS #11 接口还可以获得远程的 HSM 云服务。
我们将使用 YubiKey 5 系列作为外部 HSM 演示如何签名。
有关 YubiKey 主机工具和 PKCS #11 库的详细配置可在 此处 查看。
注意:以下配置是在 Ubuntu 22.10 上进行的。
# 安装 esptool 4.5 及 HSM 依赖项
pip install esptool[hsm]==4.5.dev3
# 安装工具和 PKCS#11 接口库
sudo apt install yubico-piv-tool ykcs11
# 在 9c(数字签名)域中生成 ECC P256 私钥
yubico-piv-tool -a generate -s 9c -A ECCP256
以下是我们要提供给 espsecure.py 的 HSM 配置文件。
$ cat hsm_cfg.ini
# 基于 YubiKey 的外部 HSM 配置文件
[hsm_config]
# PKCS11 共享对象/库
pkcs11_lib = /usr/lib/x86_64-linux-gnu/libykcs11.so
# HSM 登录凭证(YubiKey 默认 PIN 码)
credentials = 123456
# 要使用的域(YubiKey 默认域)
slot = 0
# 用于存储私钥的对象的标签(默认)
label = Private key for Digital Signature
# 用于存储相应公钥的对象的标签(默认)
label_pubkey = Public key for Digital Signature
请注意,libykcs11.so 路径应替换为您系统里的安装路径。
运行以下命令,使用 hsm_cfg.ini 文件里的配置对固件进行签名。
$ espsecure.py sign_data --version 2 --hsm --hsm-config hsm_cfg.ini --output signed.bin unsigned.bin
espsecure.py v4.5-dev
Trying to establish a session with the HSM.
Session creation successful with HSM slot 0.
Trying to extract public key from the HSM.
Got public key with label Public key for Digital Signature.
Connection closed successfully
Trying to establish a session with the HSM.
Session creation successful with HSM slot 0.
Got private key metadata with label Private key for Digital Signature.
Signing payload using the HSM.
Signature generation successful.
Connection closed successfully
Pre-calculated signatures found
1 signing key(s) found.
Signed 65536 bytes of data from unsigned.bin. Signature sector now has 1 signature blocks.
出于完整性考虑,我们可以使用外部 HSM 提供的公钥来验证签名。
$ espsecure.py verify_signature --version 2 --hsm --hsm-config hsm_cfg.ini signed.bin
espsecure.py v4.5-dev
Trying to establish a session with the HSM.
Session creation successful with HSM slot 0.
Trying to extract public key from the HSM.
Got public key with label Public key for Digital Signature.
Connection closed successfully
Signature block 0 is valid (ECDSA).
Signature block 0 verification successful using the supplied key (ECDSA).
更多关于使用 HSM 进行安全签名的说明可参阅 Esptool 文档。
请注意,此功能将在 Esptool v4.5 release 版本中提供。目前,您可以在 Esptool dev 版本中调用 pip install esptool[hsm]==4.5.dev3 先行试用。
如您有任何问题或反馈,欢迎随时联系我们。