更新 KEK 和数据库证书

本文档介绍了如何更新在 2025 年 11 月 7 日之前创建的计算实例上的允许签名数据库 (db) 和密钥交换密钥 (KEK) 变量,以信任安全启动的更新证书。

对于不重新创建受影响的计算实例的客户,KEK 和 db 更新是一种替代方案。

关于重启要求的注意事项: 与 Windows 不同,Linux 不需要重启系统 即可将 KEK 和 db 签名更新写入 UEFI 变量。Linux 会在执行命令后立即将更新写入 NVRAM 或固件存储空间。

准备工作

在更新安全启动 KEK 和 db 证书之前,请验证您的实例是否需要更新,并完成以下准备工作,以防止出现潜在的启动或解密问题:

  • 前提条件验证验证您的实例是否需要更新安全启动证书。
  • 数据完整性和密钥恢复: 找到磁盘加密(BitLocker 或 LUKS FDE)恢复密钥并备份关键数据。如果配置不正确,更改安全变量可能会锁定对磁盘的访问权限。
  • Linux 更新顺序建议: 对于 Linux 实例,我们建议您先将 db UEFI 变量更新为 Microsoft UEFI CA 2023,然后再更新为新的 shim。如果仅使用 Microsoft UEFI CA 2023 签名的 shim 更新是在数据库仅包含 2011 证书的情况下应用的,则此顺序有助于防止潜在的 CA 不匹配情况。

使用 fwupd 在 Linux 上更新 db 和 KEK

fwupdmgr 版本 2.0.10 或更高版本支持此方法。运行 sudo fwupdmgr --version 即可查看您的版本。

关于 RHEL 8/9 的注意事项: RHEL 8/9 的企业代码库提供了早期版本的 fwupdmgr(RHEL 8 的版本为 1.7.8,RHEL 9 的版本为 1.9.13),这些版本不符合所需的版本阈值。如果您运行的是 RHEL 8/9,则必须执行以下操作之一:从源代码构建 fwupd,或使用稍后介绍的 sbsigntools 方法。

运行以下命令:

sudo fwupdmgr refresh
sudo fwupdmgr update 5bc922b7bd1adb5b6f99592611404036bd9f42d0
sudo fwupdmgr update b7a1d3d90faa1f6275d9a98da4fb3be7118e61c7

使用 efitools 在 Linux 上更新 db 和 KEK

以下步骤将指导您使用 efitools 软件包更新 dbKEK 变量。

更新 db

  1. 从 Microsoft 的代码库下载更新二进制文件:

    wget https://github.com/microsoft/secureboot_objects/raw/refs/heads/main/PostSignedObjects/Optional/DB/amd64/DBUpdate3P2023.bin
    
  2. 使变量可变 - 移除写保护标志:

    sudo chattr -i /sys/firmware/efi/efivars/db-*
    
  3. 运行 efi-updatevar 以更新变量:

    sudo efi-updatevar -a -f DBUpdate3P2023.bin db
    
  4. 恢复写保护标志以保护变量:

    sudo chattr +i /sys/firmware/efi/efivars/db-*
    

更新 KEK

  1. 下载包含证书更新的 .cab 归档文件:

    wget https://fwupd.org/downloads/1953fae13600a35944e93cd244476a6f6ce5fdbf620709b2f6f378fac2ae3bef-KEK-google_compute_engine.cab
    
  2. 如果您未安装 gcab,请进行安装。例如,在 Debian 或 Ubuntu 上,运行以下命令:

    sudo apt update
    sudo apt install gcab
    
  3. 使用 gcab 解压缩归档文件:

    gcab --extract 1953fae13600a35944e93cd244476a6f6ce5fdbf620709b2f6f378fac2ae3bef-KEK-google_compute_engine.cab
    
  4. 确保该文件具有预期的 MD5 哈希:6a1c58e1b8391c0e3f2e97f83917807a

    md5sum kek2023update.bin
    
  5. 使 KEK 变量可变:

    sudo chattr -i /sys/firmware/efi/efivars/KEK-*
    
  6. 应用更新:

    sudo efi-updatevar -a -f kek2023update.bin KEK
    
  7. 恢复写保护标志以保护变量:

    sudo chattr +i /sys/firmware/efi/efivars/KEK-*
    

使用 sbsigntools 在 Linux 上更新 db 和 KEK

以下步骤将指导您使用 sbsigntools 软件包及其 sbkeysync 实用程序更新 dbKEK 变量。

关于软件包名称和可用性的注意事项: 基于 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 的发行版将实用程序软件包命名为 sbsigntools(末尾带有“s”)。EPEL(Extra Packages for Enterprise Linux,适用于企业版 Linux 的额外软件包)代码库提供了此软件包。如需在 RHEL 上安装此软件包,请启用 EPEL 代码库 (sudo dnf install epel-release),然后运行:sudo dnf install sbsigntools

更新 db

  1. 从 Microsoft 的代码库下载更新二进制文件:

    wget https://github.com/microsoft/secureboot_objects/raw/refs/heads/main/PostSignedObjects/Optional/DB/amd64/DBUpdate3P2023.bin
    
  2. 将文件放在 sbkeysync 的相应文件夹中,使 db 可变,然后运行同步:

    sudo mkdir -p /etc/secureboot/keys/db
    sudo cp DBUpdate3P2023.bin /etc/secureboot/keys/db/
    sudo chattr -i /sys/firmware/efi/efivars/db-*
    sudo sbkeysync --verbose
    
  3. 恢复写保护标志以保护变量:

    sudo chattr +i /sys/firmware/efi/efivars/db-*
    

更新 KEK

如需更新 KEK 变量,请下载 Microsoft KEK 更新 Cabinet 归档文件,解压缩更新二进制文件,然后使用 sbkeysync 实用程序进行同步。以下部分介绍了如何根据您的发行版解压缩二进制文件:

  1. 下载包含 KEK 证书更新的 .cab 归档文件:

    wget https://fwupd.org/downloads/1953fae13600a35944e93cd244476a6f6ce5fdbf620709b2f6f378fac2ae3bef-KEK-google_compute_engine.cab
    
  2. 解压缩 .cab 归档文件以获取 KEK 更新二进制文件 (kek2023update.bin):

    • 在 Debian/Ubuntu 上 使用 gcab 实用程序:

      sudo apt update && sudo apt install gcab -y
      gcab --extract 1953fae13600a35944e93cd244476a6f6ce5fdbf620709b2f6f378fac2ae3bef-KEK-google_compute_engine.cab
      
    • 在基于 RHEL/CentOS 的发行版 (例如 RHEL 8/9)上使用 EPEL 中的 cabextract 实用程序:

      sudo dnf install epel-release -y
      sudo dnf install cabextract -y
      cabextract -f 1953fae13600a35944e93cd244476a6f6ce5fdbf620709b2f6f378fac2ae3bef-KEK-google_compute_engine.cab
      
  3. 验证解压缩的 kek2023update.bin 文件是否具有预期的 MD5 哈希:6a1c58e1b8391c0e3f2e97f83917807a

    md5sum kek2023update.bin
    
  4. 将二进制文件放在 sbkeysync 的相应文件夹中,使 KEK 变量可变,然后运行同步:

    sudo mkdir -p /etc/secureboot/keys/KEK
    sudo cp kek2023update.bin /etc/secureboot/keys/KEK/
    sudo chattr -i /sys/firmware/efi/efivars/KEK-*
    sudo sbkeysync --verbose
    
  5. 恢复写保护标志以保护变量:

    sudo chattr +i /sys/firmware/efi/efivars/KEK-*
    

在 Windows 上更新 db 和 KEK

如果您不在此实例上使用或计划使用安全启动,则无需应用这些证书更新。如果未启用安全启动,Windows 操作系统通常会忽略应用这些安全启动证书更新的尝试,因为更新是不必要的。

如果您打算稍后使用安全启动,则必须先在实例上启用安全启动,才能更新安全启动证书。

在 Windows 实例上,注册表设置和计划任务会在兼容版本上触发更新:

  1. 确保您的 Windows 实例已应用最新的每月更新。
  2. 在 PowerShell 中,以管理员身份运行:

    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name "AvailableUpdates" -Value 0x5944
    Start-ScheduledTask -TaskName "\Microsoft\Windows\PI\Secure-Boot-Update"
    
  3. 重启实例,以允许对固件变量执行操作。如果虚拟化安全功能处于活跃状态,某些环境需要重启两次。