为 UEFI 启用安全启动#

您可以为您的生产 NVIDIA IGX 设备启用端到端安全启动。 有关概述,请参阅IGX 的安全启动

在您完成本文档中的步骤之前,请完成为 Pre-UEFI 阶段启用安全启动中的步骤。

要为 UEFI 阶段启用安全启动,请使用以下文档

UEFI 安全启动概述#

UEFI 安全启动使用数字签名 (RSA) 来验证其加载的代码的真实性和完整性。

How PK/KEK/db keys are used in UEFI secure boot

先决条件#

在您可以完成本文档中的步骤之前,您需要在您的计算机上安装以下内容

  • openssl

  • device-tree-compiler

  • efitools

  • uuid-runtime

  • BSP

  1. 在您的 Linux 主机计算机上,从 IGX 下载中心下载引导加载程序 (BSP) 包

  2. 在主机计算机上,运行以下代码。

    1tar xvf Jetson_Linux_R36.x.x_aarch64.tbz2
    2cd <Linux_for_Tegra>
    

准备密钥#

在本示例中,我们仅出于演示目的,通过使用自签名证书来准备密钥。 对于生产环境,请遵循您的官方证书生成程序。

  1. 要生成 PK RSA 密钥对和证书,请运行以下代码。

    1cd <Your_DIR>/Linux_for_Tegra
    2mkdir uefi_keys
    3cd uefi_keys
    4GUID=$(uuidgen)
    5openssl req -newkey rsa:3072 -nodes -keyout PK.key  -new -x509 -sha256 -days 3650 \
    6   -subj "/CN=Vendor Owned Platform Key/" -out PK.crt
    7cert-to-efi-sig-list -g "${GUID}" "PK.crt" PK.esl
    

    注意

    保管好您的 PK.key 私钥文件。 您的 IGX 设备的安全性取决于您的私钥的安全性。

  2. 要生成 KEK 和 DB RSA 密钥对和证书,请运行以下代码。

     1cd <Your_DIR>/Linux_for_Tegra/uefi_keys
     2
     3openssl req -newkey rsa:3072 -nodes -keyout KEK_vendor.key -new -x509 -sha256 -days 3650 \
     4   -subj "/CN=Vendor Owned Key Exchange Key/" -out KEK_vendor.crt
     5cert-to-efi-sig-list -g "${GUID}" KEK_vendor.crt KEK_vendor.esl
     6sign-efi-sig-list -k PK.key -c PK.crt KEK KEK_vendor.esl KEK_vendor.auth
     7
     8openssl req -newkey rsa:3072 -nodes -keyout db_vendor.key  -new -x509 -sha256 -days 3650 \
     9   -subj "/CN=Vendor Owned Signature Database key/" -out db_vendor.crt
    10cert-to-efi-sig-list -g "${GUID}" db_vendor.crt db_vendor.esl
    11sign-efi-sig-list -k KEK_vendor.key -c KEK_vendor.crt db db_vendor.esl db_vendor.auth
    

    注意

    保管好您的 KEK_vendor.keydb_vendor.key 私钥文件。 您的 IGX 设备的安全性取决于您的私钥的安全性。

  3. 下载 Microsoft KEK 和 DB esl 文件,并从 Microsoft 的 DER 格式 KEK 证书创建 EFI 签名列表。

    1cd <Your_DIR>/Linux_for_Tegra/uefi_keys
    2
    3# download Microsoft Corporation KEK CA 2011 certificate:
    4curl -O https://www.microsoft.com/pkiops/certs/MicCorKEKCA2011_2011-06-24.crt
    5sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt
    6
    7# download Microsoft Corporation UEFI CA 2011 certificate:
    8curl -O https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
    9sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
    
  4. 附加 KEK 和 DB 的 esl 文件。

    1cat KEK_vendor.esl MS_Win_KEK.esl > combined_KEK.esl
    2cat db_vendor.esl MS_UEFI_db.esl > combined_db.esl
    

启用 UEFI 安全启动#

有两种方法可以启用 UEFI 安全启动

注意

尽管您可以独立于低级引导加载程序安全启动来启用 UEFI 安全启动,但我们强烈建议您启用引导加载程序安全启动,以便信任根可以从 BootROM 开始。

在运行时启用 UEFI 安全启动#

您可以从内核在运行时启用 UEFI 安全启动,方法是使用从 Ubuntu 运行的 UEFI 实用程序。 这些说明适用于未刷写启用 UEFI 安全启动的目标。

  1. 确保 IGX 网络端口已连接。 使用左侧的端口,在I/O 和外部接口的图表中标记为 4。

  2. 要在 IGX 上安装 UEFI 实用程序 efitoolsefivar,请运行以下代码。

    1sudo apt update
    2sudo apt-get install efitools
    3sudo apt-get install efivar
    
  3. 通过运行以下代码,验证安全启动尚未启用。 如果返回值是 0,则安全启动未启用。 如果返回值是 1,则安全启动已启用。

    1efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SecureBoot
    
  4. 要在您的计算机上生成文件 PK.auth,请运行以下代码。

    注意

    在执行此步骤之前,请验证您是否已在准备密钥部分中生成了 KEK 和 DB RSA 密钥对和证书。

    1cd <Your_DIR>/Linux_for_Tegra/uefi_keys
    2sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.auth
    
  5. 要从主机计算机下载文件 PK.authcombined_KEK.eslcombined_db.esl 到 IGX,请运行以下代码。

    1cd /opt
    2sudo mkdir uefi_keys
    3
    4sudo scp <host_name>@<host_ip>:<Your_DIR>/Linux_for_Tegra/uefi_keys/PK.auth ./uefi_keys/
    5sudo scp <host_name>@<host_ip>:<Your_DIR>/Linux_for_Tegra/uefi_keys/combined_KEK.esl ./uefi_keys/
    6sudo scp <host_name>@<host_ip>:<Your_DIR>/Linux_for_Tegra/uefi_keys/combined_db.esl ./uefi_keys/
    
  6. 在注册之前,要检查 UEFI 安全启动密钥状态,请运行以下代码。

    1sudo efi-readvar
    

    输出应类似于以下内容。

    1Variable PK has no entries
    2Variable KEK has no entries
    3Variable db has no entries
    4Variable dbx has no entries
    5Variable MokList has no entries
    
  7. 要注册组合的 DB,请运行以下代码。

    1sudo efi-updatevar -e -f /opt/uefi_keys/combined_db.esl db
    
  8. 要注册组合的 KEK,请运行以下代码。

    1sudo efi-updatevar -e -f /opt/uefi_keys/combined_KEK.esl KEK
    
  9. 要注册 PK 并启用 UEFI 安全启动,请运行以下代码。

    1sudo efi-updatevar -f /opt/uefi_keys/PK.auth PK
    
  10. 重启目标设备。

  11. 通过运行以下代码,验证安全启动是否已启用。 如果返回值是 1,则安全启动现在已启用。

    1efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SecureBoot
    

    注意

    您还可以使用命令 sudo mokutil --sb-state 来检查 UEFI 安全启动的状态。

在刷写时启用 UEFI 安全启动#

要使用生成的密钥创建 UEFI 密钥配置文件,请使用以下步骤。

  1. 要打开和编辑您的 uefi_keys.conf 文件,请运行以下代码。

    1cd to <Your_DIR>/Linux_for_Tegra/uefi_keys
    2vim uefi_keys.conf
    
  2. uefi_keys.conf 文件中插入以下行。 您之前在准备密钥中生成了 .esl 文件。

    1UEFI_DEFAULT_PK_ESL="PK.esl"
    2UEFI_DEFAULT_KEK_ESL_0="MS_Win_KEK.esl"
    3UEFI_DEFAULT_DB_ESL_0="MS_UEFI_db.esl"
    4UEFI_DEFAULT_KEK_ESL_1="KEK_vendor.esl"
    5UEFI_DEFAULT_DB_ESL_1="db_vendor.esl"
    
  3. 要生成 UefiDefaultSecurityKeys.dtbo 文件,请运行以下代码。

    1cd ..
    2sudo tools/gen_uefi_keys_dts.sh --no-signing-key uefi_keys/uefi_keys.conf
    3cp uefi_keys/UefiDefaultSecurityKeys.dtbo bootloader/
    
  4. 将 IGX 设备置于恢复模式。 有关详细信息,请参阅将系统置于恢复模式

  5. 使用 UefiDefaultSecurityKeys.dtbo 文件,使用仅 QSPI 配置刷写 IGX。 如果板上已启用 IGX 安全启动,请指定 -u <RSA-Private-Key>-v <sbk key>。 您可以使用此步骤在一个刷写步骤中同时启用 pre-UEFI 和 UEFI 安全启动,并同时启用两者。

    1sudo ADDITIONAL_DTB_OVERLAY="UefiDefaultSecurityKeys.dtbo" ./flash.sh [-u <RSA-Private-Key>] [-v <SBK-key>] p3740-0002-p3701-0008-qspi external
    
  6. 启动到操作系统,并通过运行以下代码检查 UEFI 安全启动状态。

    1 mokutil --sb-state
    

    您应该看到以下输出。

    1SecureBoot enabled