Windows Server 2025 WDS 启动文件签名过期导致 Secure Boot PXE 失败(Invalid signature)的修复指南

1. 故障背景

Windows Server 2025 WDS 使用的 UEFI PXE 启动文件存在旧签名问题。启用 Secure Boot 的客户端在执行下载的 EFI 启动程序时,无法通过固件的签名验证,导致 PXE 启动失败。

本次故障中,客户端能够成功下载 NBP 文件,但在执行启动程序之前就触发了 Secure Boot 验证失败(Invalid signature)。

核心问题: WDS 实际使用的 EFI 启动文件仍为旧版本。安装 Windows 累积更新后,WDS 部署目录中的文件并未自动同步更新,因此需要检查签名状态、更新系统文件,并手动替换 WDS 实际使用的启动文件。

2. 修复流程概览

  1. 安装补丁前,检查 WDS 当前使用的 EFI 文件、签名状态和 SHA-256。
  2. 检查系统提供的备用 EFI 文件及其签名状态。
  3. 安装 Windows Server 2025 累积更新 KB5126646 并重启服务器。
  4. 检查更新后的系统 EFI 文件。
  5. 备份并替换 WDS 部署目录中的旧 EFI 文件。
  6. 验证目标文件签名及 SHA-256。
  7. 重启 WDS 服务并验证客户端 PXE 启动。

3. 安装补丁前的检查

以下检查应在安装系统补丁之前执行,并记录结果,以便对比修复前后的文件变化。

3.1 确认系统和 WDS 部署目录

在管理员 PowerShell 中执行:

1
2
3
4
5
6
7
8
9
10
11
Get-ComputerInfo |
Select-Object WindowsProductName, OsBuildNumber

Get-Service WDSServer

$dst = "C:\RemoteInstall\Boot\x64"
$src = "$env:windir\System32\RemInst\boot_EX\x64"

Get-ChildItem "$dst\wdsmgfw.efi",
"$dst\bootmgfw.efi" |
Select-Object FullName, Length, LastWriteTime

确认 WDS 服务已安装,并记录实际部署目录中两个 EFI 文件的大小和修改时间。

如果 WDS 部署目录不是 C:\RemoteInstall,应将后续命令中的 $dst 修改为实际路径。

3.2 检查 WDS 当前使用的 EFI 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$files = @(
"$dst\wdsmgfw.efi",
"$dst\bootmgfw.efi"
)

foreach ($file in $files) {
if (Test-Path $file) {
$sig = Get-AuthenticodeSignature $file
$hash = Get-FileHash $file -Algorithm SHA256

[PSCustomObject]@{
File = $file
Size = (Get-Item $file).Length
Status = $sig.Status
Signer = $sig.SignerCertificate.Subject
Issuer = $sig.SignerCertificate.Issuer
NotBefore = $sig.SignerCertificate.NotBefore
NotAfter = $sig.SignerCertificate.NotAfter
SHA256 = $hash.Hash
} | Format-List
}
else {
Write-Warning "File not found: $file"
}
}

重点检查:

  • Status:签名验证状态。
  • Issuer:签名证书的颁发者。
  • NotAfter:签名证书的有效期截止时间。
  • SHA256:记录原始文件哈希,供后续对比。

注意: Get-AuthenticodeSignature 返回 UnknownError 并不能单独证明证书已经过期。应结合证书有效期、证书链、客户端 Secure Boot 策略及实际启动结果判断。

3.3 检查系统提供的备用 EFI 文件

补丁安装前,确认系统目录中是否存在备用启动文件:

1
2
Get-ChildItem $src -ErrorAction SilentlyContinue |
Select-Object Name, Length, LastWriteTime

如果文件存在,检查签名:

1
2
3
Get-AuthenticodeSignature "$src\wdsmgfw_EX.efi",
"$src\bootmgfw_EX.efi" |
Format-List Status, Path, SignerCertificate

如果源文件不存在,或签名检查结果异常,应记录现状,不要直接覆盖 WDS 文件。

4. 安装 Windows 累积更新

本次使用的更新:

如果服务器无法访问互联网,可在另一台联网计算机上从 Microsoft Update Catalog 下载适用的 MSU 文件,再通过受控介质传输到服务器。

安装前应确认更新适用于当前操作系统和架构,并遵循 Microsoft 对该更新的安装要求。

安装后按要求重启服务器,再执行:

1
2
3
4
Get-HotFix -Id KB5126646 -ErrorAction SilentlyContinue

Get-ComputerInfo |
Select-Object WindowsProductName, OsBuildNumber

如果 Get-HotFix 没有返回记录,不应直接判定更新安装失败;可以结合 Windows Update 历史记录和 DISM 包状态确认。

注意: 不要仅因为更新说明提到 checkpoint cumulative update,就假定必须手动单独安装所有前置更新。应按照 Microsoft 对目标更新的适用条件和安装路径执行。

5. 检查补丁更新后的 EFI 文件

更新并重启后,重新检查系统目录:

1
2
3
4
$src = "$env:windir\System32\RemInst\boot_EX\x64"

Get-ChildItem $src |
Select-Object Name, Length, LastWriteTime

确认以下两个文件存在:

  • wdsmgfw_EX.efi
  • bootmgfw_EX.efi

检查签名、证书信息和 SHA-256:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$files = @(
"$src\wdsmgfw_EX.efi",
"$src\bootmgfw_EX.efi"
)

foreach ($file in $files) {
$sig = Get-AuthenticodeSignature $file

[PSCustomObject]@{
File = $file
Status = $sig.Status
Issuer = $sig.SignerCertificate.Issuer
SHA256 = (Get-FileHash $file -Algorithm SHA256).Hash
} | Format-List
}

继续条件: 两个源文件均存在,签名状态均为 Valid,且证书链符合目标客户端的 Secure Boot 信任要求。若检查失败,应停止操作并进一步调查。

6. 备份并替换 WDS 启动文件

6.1 备份现有文件

1
2
3
4
5
6
7
8
9
10
11
12
$src = "$env:windir\System32\RemInst\boot_EX\x64"
$dst = "C:\RemoteInstall\Boot\x64"
$backup = "C:\RemoteInstall\Boot\x64-backup-$(Get-Date -Format yyyyMMdd-HHmmss)"

New-Item -ItemType Directory -Path $backup -Force | Out-Null

Copy-Item "$dst\wdsmgfw.efi",
"$dst\bootmgfw.efi" `
-Destination $backup

Get-ChildItem $backup |
Select-Object Name, Length, LastWriteTime

确认两个文件均已备份后再继续。

6.2 替换为新版 EFI 文件

1
2
3
4
5
Copy-Item "$src\wdsmgfw_EX.efi" `
"$dst\wdsmgfw.efi" -Force

Copy-Item "$src\bootmgfw_EX.efi" `
"$dst\bootmgfw.efi" -Force

文件对应关系:

系统提供的新版文件 WDS 目标文件
wdsmgfw_EX.efi wdsmgfw.efi
bootmgfw_EX.efi bootmgfw.efi

目标文件名不保留 _EX 后缀。

7. 验证替换结果

7.1 验证目标文件签名

1
2
3
Get-AuthenticodeSignature "$dst\wdsmgfw.efi",
"$dst\bootmgfw.efi" |
Format-Table Status, Path

两个文件的签名状态均应为 Valid。

7.2 验证 SHA-256

1
2
3
4
5
Get-FileHash "$src\wdsmgfw_EX.efi",
"$src\bootmgfw_EX.efi" -Algorithm SHA256

Get-FileHash "$dst\wdsmgfw.efi",
"$dst\bootmgfw.efi" -Algorithm SHA256

逐一比较对应源文件和目标文件的 SHA-256,结果必须完全一致。

8. 重启 WDS 服务

执行:

1
2
3
4
5
Get-Service WDSServer

Restart-Service WDSServer

Get-Service WDSServer

确认 WDS 服务恢复正常后,再执行客户端 PXE 验证。

9. 客户端验收标准

使用此前出现故障的客户端,保持 UEFI Secure Boot 启用,重新执行 IPv6 PXE 启动。

通过标准:

  1. NBP 文件能够正常下载。
  2. 不再出现 Secure Boot 签名验证失败。
  3. 能够进入 WDS 启动菜单或继续加载 WinPE。
  4. 至少使用一台此前受影响的客户端进行复测。

如果故障仍然存在,应确认客户端实际下载的 NBP 是否为更新后的文件,并进一步检查客户端 Secure Boot 信任数据库、撤销列表、IPv6 PXE 配置及网络转发路径。

10. 回滚方法

如果替换后出现新的启动问题,可从备份目录恢复原文件:

1
2
3
4
5
6
7
8
9
10
$dst = "C:\RemoteInstall\Boot\x64"
$backup = "C:\RemoteInstall\Boot\x64-backup-实际时间戳"

Copy-Item "$backup\wdsmgfw.efi" `
"$dst\wdsmgfw.efi" -Force

Copy-Item "$backup\bootmgfw.efi" `
"$dst\bootmgfw.efi" -Force

Restart-Service WDSServer

执行前必须确认备份路径正确、两个备份文件均存在。

回滚会恢复旧启动文件。如果旧签名正是 Secure Boot 拒绝启动的原因,原故障可能再次出现,因此不应将回滚作为长期解决方案。

11. 修复结论

本次故障的关键在于:WDS 实际下发的旧 EFI 启动文件无法通过受影响客户端的 Secure Boot 验证,而安装系统累积更新后,WDS 部署目录中的文件仍未自动同步更新。

通过检查补丁前的文件状态、安装 KB5126646、确认系统提供的新版 EFI 文件签名有效、替换 WDS 实际使用的启动文件,并重启 WDS 服务,最终恢复了客户端 PXE 启动。

后续安装涉及 Secure Boot、启动管理器或 WDS 的系统更新后,应额外检查 WDS 实际部署目录中的 EFI 文件是否已同步更新,不能仅凭系统补丁安装成功就认为 PXE 启动文件已完成更新。