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

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

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


外部 HSM 签名

乐鑫 SoC 支持使用外部 HSM 进行安全签名_第1张图片 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-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 先行试用。


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

你可能感兴趣的:(乐鑫科技,乐鑫,SoC,外部,HSM,签名验证,设备安全)