需求
Digi Embedded Yocto在生成安全固件映像时使用恩智浦的代码签名工具(CST)用于高保证启动库。如果找不到该工具,则Digi Embedded Yocto TrustFence构建失败。按照以下步骤在工作空间中安装CST工具:
下载CST工具https://www.nxp.com/webapp/Download?colCode=IMX_CST_TOOL_NEW&location=null.
如果您还没有使用Digi Embedded Yocto工作空间,请在工作空间中创建下载文件夹。
将该工具放在Digi Embedded Yocto项目工作区的下载文件夹中。
Digi Embedded Yocto将尝试使用它支持的最新CST。若要使用与支持的最新版本不同的CST版本,请参见高级选项. |
为您的Digi Embedded Yocto项目添加安全启动支持:
1.配置安全启动
要构建签名和加密的工件,请修改您的conf / local.conf
档案须包括以下内容:
#需要包含信任防御支持。继承+ =“trustfence”
默认情况下启用映像签名。若要显式禁用生成签名映像,请参见高级选项.
在默认情况下,Digi Embedded Yocto会在一个名为trustfence
在你的项目中。如果需要自定义PKI树路径,请参见高级选项.
1.1.U-Boot环境加密
启用TrustFence时,U-Boot环境默认使用CAAM OTPMK和安全的内部唯一密钥进行加密。
此功能仅在封闭设备中支持。此设置对打开的设备没有影响。 |
要显式禁用U-Boot环境加密,请参见高级选项.
2.构建目标映像
一旦在Digi Embedded Yocto项目中启用并配置了TrustFence,您就可以构建目标映像了。例如:
$bitbake dey-image-qt
构建过程完成后,部署目录中将出现几个安全构件:
imx-boot - > <平台。斌
:这些是默认的U-Boot映像。它们没有签名。imx-boot-signed - > <平台。斌
这些是已签名的U-Boot映像。像默认的U-Boot映像一样,它们是特定于每个变体的。imx-boot-encrypted - > <平台。斌
这些是针对每个变体的签名和加密的U-Boot映像。SRK_efuses.bin
:这是一个包含SRK公钥散列的文件。在设置设备进行安全启动时将需要它。一个
dey-image-qt-xwayland——<平台> .boot.vfat
图片包含以下内容:Image.gz - > <平台。斌
:已签名加密的Linux内核镜像。.dtb
files:针对所有硬件平台的签名和加密的设备树blob文件。boot.scr
:已签名加密的U-Boot引导脚本。dey-image-trustfence-initramfs——<平台> .cpio.gz.u-boot.tf
:签名加密initramfs,用于rootfs加密。
一个
dey-image-qt-xwayland——<平台> .recovery.vfat
图片包含以下内容:Image.gz - > <平台。斌
:已签名加密的Linux内核镜像。.dtb
files:针对所有硬件平台的签名和加密的设备树blob文件。boot.scr
:已签名加密的U-Boot引导脚本。uramdisk-recovery.img
:签名和加密的initramfs用于恢复。
一个
dey-image-qt-xwayland——<平台> .sdcard.gz
压缩的microSD卡映像能够启动关闭的设备一旦解压缩。如果开启了安全启动加密功能,micro - sd卡镜像可以引导关闭的设备进入U-Boot,但不能引导操作系统。
PKI树和加密密钥也会生成(如果没有提供)。它们存储在指定的TRUSTFENCE_SIGN_KEYS_PATH
的位置。
该文件夹将包含以下内容:
crt /
:包含签名使用的不同证书的目录键/
:包含与每个证书关联的私钥和保护证书的密码短语的目录dek.bin
:数据加密密钥,用于对图像进行加密
下列文件必须妥善存放,才能用于制造安全装置:
SRK e-fuse公钥散列bin文件(
SRK_efuses.bin
)用于对固件镜像签名的PKI树,包括以纯文本形式的数据加密密钥
3.编程签名U-Boot映像
签名的U-Boot映像可以像任何其他U-Boot映像一样闪现:
= >更新uboot TFTP imx-boot-signed-.bin
闪烁带签名的U-Boot不会在目标中启用任何安全特性。看到固定设备学习如何关闭您的设备,只引导签名的U-Boot映像。 |
不要在打开的设备上编写加密的映像,因为内核将无法启动。 |
重新启动设备,检查是否有安全事件上报trustfence
命令:
= >重置(…)= >trustfence状态* SRK熔断器:[NOT programming]密钥0:[OK]密钥1:[OK]密钥2:[OK]密钥3:[OK] *安全启动:[OPEN] *加密U-Boot: [NO] * HAB事件:[NO ERRORS]
输出显示设备处于打开状态,SRK电子引信没有被烧毁,没有密钥被撤销,当前U-Boot映像没有被加密。
在这种情况下,不会生成任何安全引导事件。这表明镜像应该能够在关闭时引导设备。
如果存在安全引导事件,则可以使用hab_status
命令,以了解签名验证失败的原因。这是一个U-Boot命令,它将从High Assurance Boot ROM中转储额外的调试信息。
有关事件解码的更多信息,请参阅NXP安全引导应用程序说明。
4.固定设备
为设备配置安全引导的最后一步是烧录安全eFuse配置。
安全eFuse配置只能写入一次,且不可逆。 |
保护设备:
4.1.编程SRK eFuse
SRK保险丝保存着SRK公钥的哈希值。在开放设备中,它们从不被使用。在封闭设备中,它们用于验证签名固件映像中包含的公钥。
在关闭设备之前,必须将公钥的散列存储在设备上的SRK OTP位中。这将允许ROM加载程序验证包含在签名固件映像中的公钥。在构建签名U-Boot映像时,Yocto生成一个名为SRK_efuses.bin
,可用于按照以下程序以安全的方式从U-Boot shell中编程SRK熔体:
确认没有HAB事件(如所述)以上).
从U-Boot提示符中加载
SRK_efuses.bin
文件到内存使用TFTP:= >tftp ${loadaddr} srk_efuss .bin从服务器192.168.129.10使用FEC设备tftp;我们的IP地址是192.168.42.30文件名‘deploy/SRK_efuses.bin’。加载地址:0x12000000加载:# 15.6 KiB/s完成传输字节= 32(20十六进制)
控制台日志中的信息可能不同。 对设备进行编程
trustfence prog_srk
命令:= >trustfence prog_srk ${loadaddr} ${filesize}警告:程序融合是一个不可逆的操作!这可能会破坏你的系统。只有当你确定你在做什么时才使用这个命令!真的执行这个保险丝程序吗?< y / N >
的 文件大小
环境变量根据前面的自动计算tftp
的大小(以字节为单位)SRK_efuses.bin
文件。
为了简化密钥管理,Digi建议您使用相同的四组密钥对所有设备进行编程。
看到撤销密钥用于在这些密钥中的任何一个被泄露时采取的步骤。
4.2.关闭设备
这一步是不可逆转的可以把你的设备弄坏. 关闭设备前:
|
要关闭设备,请使用Digi的U-Boottrustfence密切
命令,然后重置目标器。
= >trustfence密切= >重置
之后,设备将只引导正确签名的映像。
关闭设备后,请考虑以下方法进一步保护您的设备:
|
默认情况下,U-Boot环境加密功能是启用的,因此U-Boot将从前一个(未加密的)环境导入MAC地址(以及任何其他write-once环境变量),并将任何其他变量重置为默认值。之后,它将用加密的数据覆盖环境。
要确保对环境的两个副本都进行加密,请保存环境两次在支持环境加密的U-Boot启动后立即启动,如下所示:
= >saveenv保存环境到MMC…写入到MMC(0)…完成= >saveenv保存环境到MMC…写入冗余MMC(0)…完成
5.在一个封闭的设备上编程加密的工件
一旦设备被关闭,加密使用唯一和安全的OTPMK(一次性可编程主密钥)。更新过程将把DEK加密成一个加密的blob,并将其存储在U-Boot分区中。这必须通过唯一的安全OTPMK来实现,因此请确保在设备关闭并重新启动后进行最终编程。
有两种方法可以刷新加密的U-Boot映像:保护新的DEK或重用现有的DEK。
5.1.确保一个新的DEK
如果您是第一次使用加密的映像,或者如果您想更改DEK,请使用此方法。在这种情况下,您需要两个输入工件:
加密的U-Boot映像
明文形式的数据加密密钥(DEK)
使用以下命令刷新加密后的U-Boot镜像:
= >更新TFTP imx-boot-encrypted- dek.bin
使用上述命令,U-Boot映像被刷新,DEK被保护并存储在uboot分区。
在开放设备上,加密使用测试主密钥,而在封闭设备上,加密使用唯一且安全的OTPMK。因此,加密U-Boot映像的最终编程必须在关闭设备并复位后完成。
只有在使用封闭设备时,DEK blob才得到保护。当使用开放设备时,DEK blob是不安全的,并且可以从媒体中恢复纯文本的DEK和解密的U-Boot。
设备现在启动到一个签名和加密的U-Boot。
您总是可以通过从恢复介质启动正确签名的U-Boot来恢复关闭的设备。看到恢复您的设备.
5.2.重用现有的DEK
如果需要一个新的U-Boot映像(例如,用于新特性),但使用了相同的DEK,则不需要再次发送纯文本DEK。这对于在字段中执行的更新很有用。
在这种情况下,使用与保护新DEK时相同的命令,但省略DEK参数:
= >更新TFTP imx-boot-encrypted-.bin
U-Boot映像必须用设备中已存在的DEK加密。如果设备没有安全的DEK,该命令将失败。
如果使用不同的DEK,设备将停止引导。 |
5.3.对加密工件进行编程
其余的加密工件(U-Boot除外)可以使用用于编程引导分区的标准过程进行刷新。然而,要使用任何加密工件,必须满足以下附加要求:
你必须使用一个封闭的设备。
设备必须包含使用相同加密密钥加密的U-Boot映像。
对linux包含所有加密工件的分区:
= >更新Linux TFTP dey-image-qt.boot.vfat
对复苏包含所有加密工件的分区:
= >更新恢复TFTP dey-image-qt.recovery.vfat
设备现在启动到一个受信任的Linux内核中。
6.用根文件系统加密设置您的设备
根文件系统加密为TrustFence增加了另一层安全性。它使用内核的加密支持来加密存储在根文件系统中的所有数据。尝试在没有正确加密密钥的情况下访问此数据将返回随机的、无意义的字节。
启用TrustFence(请参阅启用TrustFence支持在Digi嵌入式Yocto),则自动启用根文件系统加密。这使得使用该项目的任何SWU包在安装到目标上时都支持根文件系统加密。
Digi Embedded Yocto不执行根文件系统的加密,因此,rootfs工件不能从U-Boot编程,否则它不会挂载在完全加密的系统上。运行固件更新进程遵循以下说明对根文件系统进行加密。 |
要显式禁用根文件系统加密,请参见高级选项.
7.对加密的rootfs进行编程
创建软件更新包。要创建软件更新包,请将映像配方添加后缀进行bitbake
-swu
.例如,如果您建立了图像dey-image-qt
在启用rootfs加密的情况下,执行如下命令创建软件更新包:$bitbake dey-image-qt-swu
确保生成的软件更新工件(
.swu
文件)可被设备访问。例如,您可以将它存储在内部eMMC中,在*update中分区:$-rw-r——r——1 root root 731810304 Jan 26 18:15 dey-image-qt-swu-
.swu 或外部媒体(microSD卡,u盘):
$/run/media/sda1 -rwxrwx——1根磁盘241062400 Jan 18 19:30 dey-image-qt-swu-
.swu$. ls -l /run/media/mmcblk1p1 -rwxrwx——1根磁盘241062400 Jan 18 19:30 dey-image-qt-swu- .swu 的 * .swu
文件必须存放在分区的根目录下。不支持子文件夹。配置恢复命令以使用先前生成的包更新系统。
#更新固件文件:/ / dey-image-qt-swu - <平台> .swu
设备以恢复模式启动,并开始使用提供的包更新系统。一旦完成,设备重新启动,固件更新完成。
在首次安全系统部署之后,可以使用更新固件触发新固件更新的工具。看到来自Linux的程序固件. |
高级选项
使用自定义的CST版本
要查看Digi Embedded Yocto支持的CST版本,请在Digi Embedded Yocto项目中运行以下命令:
$Bitbake-layers show-recipes trustfence-cst
如果出现多个版本,并且您希望使用与支持的最新版本不同的CST版本,请设置该变量PREFERRED_VERSION_trustfence-cst-native
在你的conf / local.conf
:
使用不同的CST版本PREFERRED_VERSION_trustfence-cst-native =“x.y.z”
禁用映像签名
作为TrustFence的一部分,映像签名是自动启用的。要显式禁用生成签名映像,请定义TRUSTFENCE_SIGN
0:
#禁用签名映像TRUSTFENCE_SIGN=“0”
使用自定义的PKI树路径
您可以通过以下参数自定义敏感键的位置:
TRUSTFENCE_SIGN_KEYS_PATH
: PKI树所在文件夹的路径。如果文件夹不存在或文件夹中不包含PKI树,则会自动生成新的PKI树。默认值是新建文件夹trustfence
在Digi Embedded Yocto项目的home位置。
使用自定义路径到签名密钥和证书。TRUSTFENCE_SIGN_KEYS_PATH=“/ mnt /安全/ PKI_tree”
TRUSTFENCE_DEK_PATH
:数据加密密钥所在路径。当提供时,它必须是128位、192位或256位二进制文件。否则,将自动生成一个随机的256位密钥。默认值为< TRUSTFENCE_SIGN_KEYS_PATH > / dek.bin
.定义为0以禁用签名映像的加密。
#使用自定义路径到数据加密密钥(或设置为“0”来禁用加密)。TRUSTFENCE_DEK_PATH=“/ mnt /安全/ encryption_key.bin”
禁用U-Boot环境加密
要显式禁用U-Boot环境加密,请设置TRUSTFENCE_ENCRYPT_ENVIRONMENT
到0,如下所示:
#禁用U-Boot环境加密TRUSTFENCE_ENCRYPT_ENVIRONMENT=“0”
在加密环境的设备上,不带环境加密特性的U-Boot闪烁时,会丢失所有的值。在执行此过程之前,请确保保存任何重要数据,如MAC地址。 |
禁用根文件系统加密
要显式禁用根文件系统加密,请设置TRUSTFENCE_ENCRYPT_ROOTFS
到0,如下所示:
TRUSTFENCE_ENCRYPT_ROOTFS=“0”
然后,生成一个SWU包并将其安装到目标服务器上,以禁用rootfs加密。
只读rootfs认证
您可以选择构建一个只读的rootfs(参见只读根文件系统).当启用TrustFence时,生成的rootfs映像被签名,引导加载程序在引导之前对其进行身份验证。这保证了根文件来自可信的来源。