> 文章列表 > 乐鑫 SoC 支持使用外部 HSM 进行安全签名

乐鑫 SoC 支持使用外部 HSM 进行安全签名

乐鑫 SoC 支持使用外部 HSM 进行安全签名

乐鑫 ESP32 系列芯片均采用安全启动机制,确保只有可信任固件能够在 flash 中运行。然而,这种机制要求小心管理签名密钥,即签名密钥必须由签名实体以安全的方式生成和存储。

外部 (硬件安全模块)是一种专门用于保护和管理密钥的加密设备。它还可以提供专业的加密服务,如明文加密、数字签名等。现在,许多云服务都提供使用基于云 HSM 的解决方案


外部 HSM 签名

Espsecure.py: 使用外部 HSM 进行签名 
Espsecure.py: 使用外部 HSM 进行签名 

 

外部 HSM 提供了一个基于 PKCS #11 标准的加密接口,可实现对固件进行签名及其他功能。通过 PKCS #11 接口还可以获得远程的 HSM 云服务。

  • Espsecure.py 脚本(Esptool 工程的一部分)已经集成了标准 PKCS #11 接口,可与任何外部 HSM 设备兼容,对ESP32 固件进行签名。
  • 请注意,如上图所示,要使用 HSM 模式,需要在 Espsecure.py 配置中提供供应商特定的 PKCS #11 库的路径。
  • 初始支持使用 RSA-PSS 3072 或 ESDSA NISTP256 算法根据我们的 Secure Boot V2 机制生成已签名的应用程序。

使用 YubiKey 进行签名

我们将使用 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

HSM 配置文件

以下是我们要提供给 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-devTrying 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 successfullyTrying 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 successfullyPre-calculated signatures found1 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-devTrying 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 successfullySignature 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 先行试用。


如您有任何问题或反馈,欢迎随时联系我们。