鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

固件完整性保护文件准备

注意事项

  • 公私钥文件是使用用户固件完整性保护的功能时,进行身份验证和数据加密的核心凭证。私钥文件尤其敏感,一旦泄露,可能导致未经授权的访问、数据泄露或其他安全风险。
  • 开发者有责任妥善保管和保护您的公私钥文件。请确保私钥文件存储在安全的环境中,并限制对其的访问权限。任何因公私钥文件泄露、丢失或被滥用而导致的后果,均由开发者自行承担。
  • 如果私钥文件被泄露或被盗用,可能导致以下后果:
    • 未经授权的访问本开发套件或相关服务。
    • 数据泄露或被篡改。
    • 其他可能的安全风险或法律后果。
  • 为确保公私钥文件的安全,建议您采取以下措施:
    • 将私钥文件存储在安全的位置,避免与他人共享。
    • 定期检查文件权限,确保只有授权人员可以访问。
    • 如果怀疑私钥文件已被泄露,请立即停止使用该私钥并更换根证书。
    • 务必使用加密格式存储私钥文件: 建议生成并使用加密格式的私钥文件。未加密的私钥文件风险极高,一旦被非法获取,攻击者无需任何额外信息即可直接使用该私钥进行身份验证或解密操作,等同于完全暴露核心凭证。请确保在生成或转换私钥时启用密码加密,并妥善保管该密码。

操作步骤

  1. 执行以下命令安装所需的Python库pycryptodome。
    pip3 install pycryptodome 

    打印如下示例信息,表示安装成功。

    Successfully installed pycryptodome-3.21.0
  2. 如果因为网络问题导致安装失败,可以尝试使用下列方式进行安装。
  3. 生成公私钥文件。
    1. 使用OpenSSL生成加密RSA私钥。
      openssl genrsa -aes256 -out private_key.pem 4096

      打印以下内容,需要输入私钥口令。

      Enter PEM pass phrase:

      打印以下内容,需要再次输入私钥口令验证与第一次输入是否一致。

      Verifying - Enter PEM pass phrase:

      结束后当前目录会生成私钥文件rsa_private.key。

    2. 使用OpenSSL生成公钥文件。
      openssl rsa -in private_key.pem -pubout -out public_key.pem

      打印以下内容,需要输入私钥口令。

      Enter pass phrase for private_key.pem:

      打印以下内容,表示公钥生成成功,当前目录下会生成公钥文件public_key.pem。

      writing RSA key
    3. 输入内容到脚本generate_customer_pubkey_ne.py。
      # ----------------------------------------------------------------------------
      # Purpose:
      # Copyright Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
      # ----------------------------------------------------------------------------
      import argparse
      import os
      from Crypto.PublicKey import RSA
      def main():
          # 创建命令行参数解析器
          parser = argparse.ArgumentParser(
              description="Specifies the save directory where the public and private key files and hash files are generated.")
          # 添加公钥路径
          parser.add_argument(
              '-p', '--public_key_path',
              type=str,
              required=True,
              help='The path of the generated public key file.'
          )
          # 添加命令行参数,用于接收输出目录
          parser.add_argument(
              '-o', '--output_dir',
              type=str,
              required=True,
              help='The directory where the generated file is saved.'
          )
          # 解析命令行参数
          args = parser.parse_args()
          if not os.path.exists(args.public_key_path):
              print("The public key file does not exist.")
              return
          # 获取指定的输出目录
          output_dir = args.output_dir
          # 检查目录是否存在,如果不存在则创建该目录
          if not os.path.exists(output_dir):
              os.makedirs(output_dir)  # 如果目录不存在,创建目录
          # 生成 4096 位 RSA 密钥对
          with open(args.public_key_path, 'rb') as f:
              pub_key = RSA.import_key(f.read())
          # 获取公钥的 n 和 e
          n = pub_key.n
          e = pub_key.e
          # 将 n 转换为 512 Byte的字节格式
          n_bytes = n.to_bytes(512, byteorder='big')
          # 将 e 转换为 512 Byte的字节格式,如果 e 比 512 Byte小则填充前导零
          e_bytes = e.to_bytes(512, byteorder='big')
          # 将 n 和 e 拼接成 n||e 格式
          ne_bytes = n_bytes + e_bytes
          # 将拼接的 n||e 写入二进制文件
          file_path = os.path.join(output_dir, "public_key_ne.bin")
          with open(file_path, 'wb') as f:
              f.write(ne_bytes)
          print(f"n||e format public key has been saved to {file_path}.")
      if __name__ == '__main__':
          main()
    4. 执行以下命令,生成公私钥文件。
      python3 generate_customer_pubkey_ne.py -p {公钥文件public_key.pem路径} -o {指定存放目录}

    打印以下信息,表示公私钥文件已生成。

    n||e format public key has been saved to /public_key_ne.bin. 
  4. 系统需已安装OpenSSL工具,执行以下命令对文件签名。
    openssl dgst -sha256 -sign "$PRIVATE_KEY_PATH" -out "$SIGNATURE_FILE" -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 "$FILE_PATH"
    • PRIVATE_KEY_PATH:使用的私钥文件private_key.pem。
    • SIGNATURE_FILE:期待输出的签名文件sig_disable.bin。
    • FILE_PATH:需要签名的文件public_key_ne.bin。
    打印以下内容,请输入私钥口令。
    Enter pass phrase for private_key.pem:

    在对应文件目录下查看打印内容,打印以下内容表示签名文件成功生成。

    -rw-r--r-- 1 root root  3242  Apr 27 14:12 private_key.pem
    -rw-r--r-- 1 root root  1024  Apr 27 14:12 public_key_ne.bin
    -rw-r--r-- 1 root root  512   Apr 27 17:25 sig_disable.bin