一个独立的 PowerShell 脚本,用于评估 Windows 机器的安全启动证书状况,以应对 2011 → 2023 证书轮换(CVE-2023-24932 / KB5025885),并且仅当您明确要求时,才会将该机器注册到 Microsoft 服务管道中。
由 Exchange Technology Services 为自行管理端点的客户和合作伙伴发布。
Microsoft 于 2011 年颁发的安全启动证书即将到期,并将被 2023 版本取代。
| 证书 | 日期 | 存储 | 角色 |
|---|---|---|---|
| Microsoft Corporation KEK CA 2011 | 已于 2026 年 6 月 24 日到期 | KEK | 授权对 DB 和 DBX 的更新 |
| Microsoft UEFI CA 2011 | 已于 2026 年 6 月 27 日到期 | DB | 签署第三方加载程序 / 选项 ROM |
| Windows Production PCA 2011 | 2026 年 10 月 19 日 | DB | 签署 Windows 引导加载程序 |
任何机器都不会在这些日期停止引导。 Microsoft 的指导是,在证书到期时未安装新证书的设备“仍将正常启动和运行”。
失去的是接收早期引导安全更新的能力——新的安全启动撤销、BitLocker 绕过缓解、引导管理器修复。这是不断累积的暴露风险,而非停机故障。
在 2026 年 10 月 19 日之后,固件从未接受 Windows UEFI CA 2023 的机器也将停止验证新签名的 Windows 引导介质,这可能影响恢复、安装和 PXE 介质。
KEK 是闸门。 如果固件中没有 Microsoft Corporation KEK 2K CA 2023,Windows 更新根本无法交付 DB 更新。缺少该证书的机器只有等到 KEK 通过 Windows 更新或 OEM BIOS 更新到达后才能被修复。这是实际中最常见的阻塞点,脚本会明确报告这一点,而不是写入一个不会起任何作用的值。
Windows PowerShell 5.1,以管理员身份——读取 UEFI 变量需要提升权限。
1. 解除文件锁定(Windows 会阻止下载的脚本):
Unblock-File .\Invoke-SecureBootCertServicing.ps1
2. 评估——安全,不做任何更改:
powershell.exe -ExecutionPolicy Bypass -File .\Invoke-SecureBootCertServicing.ps1
3. 仅在评估表明机器已就绪时应用:
.\Invoke-SecureBootCertServicing.ps1 -Apply -SuspendBitLocker
报告使用 Write-Host 写入,因此它在控制台上显示,并被 Start-Transcript 记录。普通的 > 重定向不会捕获它,通过管道传递给其他命令也不会。
Start-Transcript C:\Temp\secureboot.log
.\Invoke-SecureBootCertServicing.ps1
Stop-Transcript
如需机器可读的副本,便于在机群中收集结果:
.\Invoke-SecureBootCertServicing.ps1 -JsonPath C:\Temp\secureboot.json
报告分别显示服务状态和迁移状态。
这两者在实际环境中确实可能不一致。一台机器可能报告 UEFICA2023Status = Updated,而磁盘上的两个引导管理器二进制文件仍由 2011 签名——这种情况发生在固件出厂时已预登记 2023 CA,因此证书侧已完成,而引导管理器侧从未运行。将两者合并为一个字段会把该机器报告为已完成,而实际上它处于半迁移状态。
出于同样的原因,脚本不会从 WindowsUEFICA2023Capable 派生状态。Microsoft 的文档对该值的原话是:“仅供参考——获取安全启动更新状态时请勿使用此键。” 它仅作为诊断信息被捕获。
服务步骤会更改固件状态,这可能会移动 BitLocker 保护器所密封的 TPM PCR,进而可能在下次引导时出现恢复密钥提示。
-Apply 之前,请确认您的托管副本健康可用。-SuspendBitLocker 在下次重启期间暂停保护,以便更改在不提示的情况下重新密封。之后 BitLocker 会自动恢复。BitLocker 状态通过三种独立方式读取(Get-BitLockerVolume、manage-bde 和 Win32_EncryptableVolume)并进行对账。如果读取结果不一致,或者都无法读取卷,脚本会拒绝更改固件,而不是猜测。
默认排除虚拟机:2023 CA 通过 BIOS 更新到达固件基线,而虚拟机的固件来自其虚拟机监控程序——未更新主机上的来宾机无法自行完成迁移。
已在 Windows 11(内部版本 26200,PowerShell 5.1,以 SYSTEM 身份运行)上完成端到端测试,UEFI 启用安全启动,BitLocker 完全加密,具有 TPM + 恢复密码保护器,PCR 7,11 配置文件:
Windows UEFI CA 2023,而 bootmgfw.efi 仍由 Microsoft Windows Production PCA 2011 签名——并且没有将其报告为已完成,尽管该机器同时报告 UEFICA2023Status = Updated 和 WindowsUEFICA2023Capable = 2。0x80 撤销位(退出码 1)。-Apply 写入了 0x5944,并通过独立的注册表读取确认。-SuspendBitLocker 后重启:机器返回时没有恢复提示,BitLocker 自动恢复。Start-Transcript 捕获了完整报告;JSON 输出不包含任何恢复密钥材料。尚未观察到的: 一台机器完成完整迁移到 FullyMigrated。最后一步由 Microsoft 按设备分阶段推出所门控,这不在任何人的控制范围内。脚本会显示该门控声称的原因,而不是将其保留为无法解释的无操作。
MIT — 请参阅 LICENSE。按原样提供,不附带任何担保。在您的环境中运行之前请先审阅;它是一个可读的单一文件,正是出于这个原因。
| 属性 | 详情 |
|---|
| 默认行为 | 仅评估。 没有 -Apply 参数时不进行任何写入。 |
| 依赖项 | 无。 无需模块,无需安装程序。Windows PowerShell 5.1。 |
| 网络访问 | 无。 它从不联系任何主机。 |
| 遥测 / 上报 | 无。 它发现的所有内容都打印到您的控制台。没有任何内容离开机器。 |
| BitLocker 恢复密钥 | 从不读取、打印或传输。 它仅检查是否存在恢复密码保护器。 |
-Apply 写入的内容 | 仅一个注册表值:HKLM\SYSTEM\CurrentControlSet\Control\Secureboot 下的 AvailableUpdates = 0x5944。即文档记载的 KB5025885 选择加入项。增量式——它添加 2023 证书,但不会移除 2011 证书。 |
| 不可逆操作 | 坚决拒绝。只要安全启动保持启用,0x80 DBX 撤销位就是永久性的;脚本拒绝任何携带该位的值,除非明确传递 -AllowRevocation。不要传递它。 |
| 重启 | 它从不重启机器,也从不提示用户。 |
| 判定 | 含义 | 退出码 |
|---|
ReadyToArm | KEK 2023 存在,DB 尚未迁移,尚未选择加入。-Apply 是下一步。 | 0 |
HalfMigrated | 固件信任 2023 CA,但机器仍引导 2011 签名的加载程序。目前正常;如果 2011 被撤销,将无法引导。仍需要引导管理器更新。 | 0 |
HalfMigrated-Armed | 同上,且已选择加入。重新启动机器 — 不要再次运行 -Apply。 | 0 |
AlreadyQueued | 已选择加入,等待 Microsoft 的分阶段推出。 | 0 |
InProgress / RebootPending | 服务正在进行中。重新启动并重新运行以查看进度。 | 0 |
FullyMigrated | 已完成。引导管理器已由 2023 签名。 | 2 |
BlockedNoKek2023 | KEK 2023 缺失。请先安装待处理的 Windows 更新和/或 OEM BIOS 更新。 | 3 |
BlockedFirmwareKek | 固件没有由此机器的平台密钥签名的 KEK。需要 OEM BIOS 更新(或在虚拟机上,需要主机更新)。 | 3 |
NotApplicable-* | 传统 BIOS,或安全启动已禁用。 | 2 |
Error | 服务报告了故障;错误代码已打印。 | 0 |
| 参数 | 默认值 | 用途 |
|---|
-Apply | 关 | 执行写入。没有它则为只读。 |
-SuspendBitLocker | 关 | 在服务重启期间暂停 BitLocker。 |
-RebootCount | 1 | 要暂停跨越多少次重启(1–15)。 |
-JsonPath | 无 | 同时将评估结果写入 JSON。 |
-MountPoint | 系统驱动器 | 要评估的卷。 |
-ApplyValue | 0x5944 | AvailableUpdates DWORD 值。 |
-AllowRevocation | 关 | 任何携带不可逆 0x80 DBX 位的值都需要此参数。不要传递此参数。 |
-AllowVirtualMachine | 关 | 允许武装虚拟机。 |
-AllowServer | 关 | 允许武装 Server SKU。 |