为 UEFI 启用安全启动#
您可以为您的生产 NVIDIA IGX 设备启用端到端安全启动。 有关概述,请参阅IGX 的安全启动。
在您完成本文档中的步骤之前,请完成为 Pre-UEFI 阶段启用安全启动中的步骤。
要为 UEFI 阶段启用安全启动,请使用以下文档
UEFI 安全启动概述#
UEFI 安全启动使用数字签名 (RSA) 来验证其加载的代码的真实性和完整性。

先决条件#
在您可以完成本文档中的步骤之前,您需要在您的计算机上安装以下内容
openssl
device-tree-compiler
efitools
uuid-runtime
BSP
在您的 Linux 主机计算机上,从 IGX 下载中心下载引导加载程序 (BSP) 包。
在主机计算机上,运行以下代码。
1tar xvf Jetson_Linux_R36.x.x_aarch64.tbz2 2cd <Linux_for_Tegra>
准备密钥#
在本示例中,我们仅出于演示目的,通过使用自签名证书来准备密钥。 对于生产环境,请遵循您的官方证书生成程序。
要生成 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 设备的安全性取决于您的私钥的安全性。要生成 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.key
和db_vendor.key
私钥文件。 您的 IGX 设备的安全性取决于您的私钥的安全性。下载 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
附加 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 安全启动的目标。
确保 IGX 网络端口已连接。 使用左侧的端口,在I/O 和外部接口的图表中标记为 4。
要在 IGX 上安装 UEFI 实用程序
efitools
和efivar
,请运行以下代码。1sudo apt update 2sudo apt-get install efitools 3sudo apt-get install efivar
通过运行以下代码,验证安全启动尚未启用。 如果返回值是
0
,则安全启动未启用。 如果返回值是1
,则安全启动已启用。1efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SecureBoot
要在您的计算机上生成文件
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
要从主机计算机下载文件
PK.auth
、combined_KEK.esl
和combined_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/
在注册之前,要检查 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
要注册组合的 DB,请运行以下代码。
1sudo efi-updatevar -e -f /opt/uefi_keys/combined_db.esl db
要注册组合的 KEK,请运行以下代码。
1sudo efi-updatevar -e -f /opt/uefi_keys/combined_KEK.esl KEK
要注册 PK 并启用 UEFI 安全启动,请运行以下代码。
1sudo efi-updatevar -f /opt/uefi_keys/PK.auth PK
重启目标设备。
通过运行以下代码,验证安全启动是否已启用。 如果返回值是
1
,则安全启动现在已启用。1efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SecureBoot
注意
您还可以使用命令
sudo mokutil --sb-state
来检查 UEFI 安全启动的状态。
在刷写时启用 UEFI 安全启动#
要使用生成的密钥创建 UEFI 密钥配置文件,请使用以下步骤。
要打开和编辑您的
uefi_keys.conf
文件,请运行以下代码。1cd to <Your_DIR>/Linux_for_Tegra/uefi_keys 2vim uefi_keys.conf
在
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"
要生成
UefiDefaultSecurityKeys.dtbo
文件,请运行以下代码。1cd .. 2sudo tools/gen_uefi_keys_dts.sh --no-signing-key uefi_keys/uefi_keys.conf 3cp uefi_keys/UefiDefaultSecurityKeys.dtbo bootloader/
将 IGX 设备置于恢复模式。 有关详细信息,请参阅将系统置于恢复模式。
使用
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
启动到操作系统,并通过运行以下代码检查 UEFI 安全启动状态。
1 mokutil --sb-state
您应该看到以下输出。
1SecureBoot enabled