对更新包进行认证和签名

由于固件更新作为驱动程序包传递,因此需要完成与常规驱动程序包相同的所有验证和签名流程。 驱动程序包需要通过 Windows 硬件实验室工具包 (Windows HLK) 测试,并且需要提交到合作伙伴中心进行签名。 签名后,驱动程序包将分发回提交者。

驱动程序包的签名不同于对 UEFI 固件或设备固件本身进行签名。 通过安全目录传递的驱动程序包上的签名由 Windows 用来验证 firmware.bin 的完整性,然后再将其交给 UEFI。 Windows 不提供固件的安全目录。 UEFI 固件或设备固件更新上的签名由平台固件验证,而不会由 Windows 检查。 IHV/OEM 负责通过签名验证、加密或其他方式确保固件的完整性和安全性。

UEFI 安全启动的固件更新签名流程和要求

对供 UEFI 安全启动处于活动状态的 Windows 设备使用的 UEFI 固件更新进行签名时,签名流程需要以下任务的某种组合:

  1. 对更新后的固件映像进行签名。

  2. 对携带更新固件的封装进行签名。

  3. 对提供给操作系统的固件更新包进行签名;此包将包含封装。

在这些任务中,始终只需要 #3。 在启用了安全启动的系统上,所有 UEFI 固件都必须签名,这意味着当更新涉及 UEFI 驱动程序或应用程序时,需要 #1。 对于连接的备用系统,#1 也是所有系统固件所必需的。 如果未通过其他方式保护固件更新,则必须对封装进行签名,以保护固件更新本身,并确保安装之前更新包的真实性。

下图指示本文其余部分讨论的各种组件的签名者。

firmware update components and signers.

对更新后的固件进行签名

签名后,必须在启动期间由系统的固件加载程序验证已更新固件的签名。 至少,重新启动时会自动执行此操作,但出于可靠性和用户体验原因,建议预先验证。

在 Arm 系统上,无法安装独立于固件映像本身的 UEFI 驱动程序或应用程序,因为唯一允许的 UEFI PE/COFF 映像是 Microsoft Windows OS 加载程序 (BootMgfw.efi),并且将使用包含 Microsoft Windows Production CA 2011 的唯一 UEFI 允许数据库条目对其进行验证。 因此,只能添加系统和设备固件。 在非 Arm 系统上,可以使用任何链接回 UEFI 允许数据库中的密钥的任何密钥对 UEFI 驱动程序和应用程序进行签名。

系统或设备固件可以使用链回到绑定到系统启动 ROM 的密钥的密钥进行签名,也可以通过其他方式(例如,已签名的封装,然后受保护的安装)受到保护。

对封装进行签名

封装内容由 OEM 确定。 封装可能只包含固件映像目录,以 OEM 选择的任何格式进行更新,也可以以 EFI 应用程序映像(PE/COFF 文件格式)的形式传送。 如果封装是 PE/COFF 文件,则必须由 OEM 签名,然后才能提交到 Microsoft 进行 Windows 固件更新包签名。

在基于 Arm 的系统上,由于没有除 UEFI 允许数据库 ("db") 中允许的 Microsoft Production CA 2011 之外的密钥,并且 Microsoft 不使用此 CA 下的签名者对第 3 方 UEFI 代码进行签名,因此此类封装的加载不能使用常规 UEFI LoadImage() 服务。 但是,可以使用针对启动 ROM 公钥或 UEFI PK 的特定于平台的验证加载封装应用程序。 对于任何其他映像,此负载仍必须测量到 TPMRF[7] 中。 更普遍的是,如果封装签名被认为有必要(例如,为了确保完整更新包的完整性和真实性),并且该封装可能包含 UEFI 外部固件的固件更新,则应以这种方式进行签名,以便使用平台持有的非 UEFI 密钥对其进行验证(例如,使用链回到绑定到启动 ROM 或 UEFI PK 的公钥的密钥进行签名)。

在非 Arm 系统上,只要使用链回到 UEFI 允许数据库中的条目的密钥进行签名,该封装就可以是 EFI 应用程序。 然后,可以自动利用 UEFI 安全启动来验证封装的完整性。

对固件更新包进行签名

固件更新包需要提交到合作伙伴中心进行签名。 此步骤将创建包内容的目录签名。 Microsoft OS 加载程序使用目录签名来验证包是否真实,且尚在通过 UpdateCapsule 向固件提供实际更新之前未被篡改。

将固件更新包提交到合作伙伴中心进行签名:

  1. 根据上一部分中的说明对封装的内容进行签名。

  2. 创建包含封装的固件更新包,并测试对固件更新包进行签名。 有关详细信息,请参阅创作更新驱动程序包

    从 Windows 8 开始,Windows 不允许 OEM Verisign 签名的固件更新包,即使在测试环境中也是如此。

  3. 通过安装固件更新包来更新固件。

  4. 在测试系统上安装 Windows 硬件实验室工具包 (HLK),并运行适用于固件设备的所有测试。

  5. 将 HLK 日志和驱动程序提交到合作伙伴中心进行签名。

提交固件更新驱动程序包时,请确保选择 Windows 8 或更高版本作为适用的 OS。 如果你选择了任何下层 OS,合作伙伴中心将使用 SHA1 算法对驱动程序包中的目录进行签名。 从 Windows 8 开始,所有固件更新驱动程序包都必须使用 SHA256 签名。

通过固件驱动程序包进行的系统和设备固件更新

填充 ESRT 表

为不同的地理区域定制固件

创作固件更新包

安装更新