需求

Digi Embedded Yocto在生成安全固件映像时使用恩智浦的代码签名工具(CST)用于高保证启动库。如果找不到该工具,则Digi Embedded Yocto TrustFence构建失败。按照以下步骤在工作空间中安装CST工具:

  1. 下载CST工具https://www.nxp.com/webapp/Download?colCode=IMX_CST_TOOL_NEW&location=null

  2. 如果您还没有使用Digi Embedded Yocto工作空间,请在工作空间中创建下载文件夹。

  3. 将该工具放在Digi Embedded Yocto项目工作区的下载文件夹中。

Digi Embedded Yocto将尝试使用它支持的最新CST。若要使用与支持的最新版本不同的CST版本,请参见高级选项

为您的Digi Embedded Yocto项目添加安全启动支持:

1.配置安全启动

要构建签名和加密的工件,请修改您的conf / local.conf档案须包括以下内容:

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内核镜像。

    • .dtbfiles:针对所有硬件平台的签名和加密的设备树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内核镜像。

    • .dtbfiles:针对所有硬件平台的签名和加密的设备树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熔体:

  1. 确认没有HAB事件(如所述)以上).

  2. 从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十六进制)
    控制台日志中的信息可能不同。
  3. 对设备进行编程trustfence prog_srk命令:

    = >trustfence prog_srk ${loadaddr} ${filesize}警告:程序融合是一个不可逆的操作!这可能会破坏你的系统。只有当你确定你在做什么时才使用这个命令!真的执行这个保险丝程序吗?< y / N >
    文件大小环境变量根据前面的自动计算tftp的大小(以字节为单位)SRK_efuses.bin文件。

为了简化密钥管理,Digi建议您使用相同的四组密钥对所有设备进行编程。

看到撤销密钥用于在这些密钥中的任何一个被泄露时采取的步骤。

4.2.关闭设备

这一步是不可逆转的可以把你的设备弄坏

关闭设备前:

  • 确认你已经编写了一个签名的,加密的U-Boot映像。

  • 运行hab_status和:

    • 确认没有HAB事件

    • 确认SRK熔断器已编程。在开放设备上不验证SRK OTP位。对于一个封闭的设备启动,所有的SRK OTP位必须被烧毁。如果SRK OTP位无效、未刻录或仅部分刻录,则没有HAB事件的打开设备引导将在关闭后停止引导。

要关闭设备,请使用Digi的U-Boottrustfence密切命令,然后重置目标器。

= >trustfence密切= >重置

之后,设备将只引导正确签名的映像。

关闭设备后,请考虑以下方法进一步保护您的设备:

  • 在固件身份验证失败后,U-Boot将下降到控制台进行调试。由于用户可以使用这个控制台来引导系统,Digi建议您在生产固件中禁用这个控制台。看到安全控制台模式

默认情况下,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进行编程

  1. 创建软件更新包。要创建软件更新包,请将映像配方添加后缀进行bitbake-swu.例如,如果您建立了图像dey-image-qt在启用rootfs加密的情况下,执行如下命令创建软件更新包:

    bitbake dey-image-qt-swu
  2. 确保生成的软件更新工件(.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文件必须存放在分区的根目录下。不支持子文件夹。
  3. 配置恢复命令以使用先前生成的包更新系统。

    #更新固件文件:/ / 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

conf / local.conf
使用不同的CST版本PREFERRED_VERSION_trustfence-cst-native =“x.y.z”

禁用映像签名

作为TrustFence的一部分,映像签名是自动启用的。要显式禁用生成签名映像,请定义TRUSTFENCE_SIGN0:

conf / local.conf
#禁用签名映像TRUSTFENCE_SIGN=“0”

使用自定义的PKI树路径

您可以通过以下参数自定义敏感键的位置:

  • TRUSTFENCE_SIGN_KEYS_PATH: PKI树所在文件夹的路径。如果文件夹不存在或文件夹中不包含PKI树,则会自动生成新的PKI树。默认值是新建文件夹trustfence在Digi Embedded Yocto项目的home位置。

conf / local.conf
使用自定义路径到签名密钥和证书。TRUSTFENCE_SIGN_KEYS_PATH=“/ mnt /安全/ PKI_tree”
  • TRUSTFENCE_DEK_PATH:数据加密密钥所在路径。当提供时,它必须是128位、192位或256位二进制文件。否则,将自动生成一个随机的256位密钥。默认值为< TRUSTFENCE_SIGN_KEYS_PATH > / dek.bin.定义为0以禁用签名映像的加密。

conf / local.conf
#使用自定义路径到数据加密密钥(或设置为“0”来禁用加密)。TRUSTFENCE_DEK_PATH=“/ mnt /安全/ encryption_key.bin”

禁用U-Boot环境加密

要显式禁用U-Boot环境加密,请设置TRUSTFENCE_ENCRYPT_ENVIRONMENT到0,如下所示:

conf / local.conf
#禁用U-Boot环境加密TRUSTFENCE_ENCRYPT_ENVIRONMENT=“0”
在加密环境的设备上,不带环境加密特性的U-Boot闪烁时,会丢失所有的值。在执行此过程之前,请确保保存任何重要数据,如MAC地址。

禁用根文件系统加密

要显式禁用根文件系统加密,请设置TRUSTFENCE_ENCRYPT_ROOTFS到0,如下所示:

conf / local.conf
TRUSTFENCE_ENCRYPT_ROOTFS=“0”

然后,生成一个SWU包并将其安装到目标服务器上,以禁用rootfs加密。

只读rootfs认证

您可以选择构建一个只读的rootfs(参见只读根文件系统).当启用TrustFence时,生成的rootfs映像被签名,引导加载程序在引导之前对其进行身份验证。这保证了根文件来自可信的来源。