QEMU 下 SecureBoot 和 EFI 签名的测试

本文将介绍如何在 QEMU 上实验 Secure Boot 的功能,以及如何对一个 EFI Application 进行签名。

首先,需要编写一个能在QEMU 上运行的,打开 Secure Boot 功能的 BIOS。编译命令如下:

build -a X64 -p OvmfPkg\OvmfPkgx64.dsc -D SECURE_BOOT_ENABLE=TRUE

即可(在 EDK202008 的版本上测试,打开这个功能后需要用到 OpenSSL 提供的函数,因此需要在 EDK2中加入 OpenSSL 的代码)。接下来,根据【参考1】,我们需要生成下面这些文件用于签名。

生成这些文件必须安装Windows SDK,这里使用的是 Windows 10 的 SDK ,工具在C:\Program Files (x86)\Windows Kits\10\bin\x64 下面:

  1. 生成 TestRoot.pvk 和 TestRoot.cer

命令:makecert -n "CN=TestRoot " -r -sv TestRoot.pvk TestRoot.cer

运行之后会要求你设置一个密码,这里我们使用  labz 作为密码。

之后会再要求你输入一次 labz

2.生成TestSub.pvk 和 TestSub.cer

命令:makecert -n "CN=TestRoot " -iv TestRoot.pvk -ic TestRoot.cer -sv TestSub.pvk TestSub.cer

这里会要求你设置另外一个密码,这里我们使用 labzpri

输入你设置的 labzpri

再次弹出的对话框输入之前设置的 labz 这个密码

现在我们就有了前面提到的4个文件。

然后准备一个用于测试的EFI 文件,我们使用 Hell.EFI ,它只是在屏幕上输出字符串。同样的,使用 SDK 中的工具对其进行签名,命令如下:

C:\Program Files (x86)\Windows Kits\10\bin\x64>signtool sign /ac TestSub.cer /f TestSub.pfx /p labzpri /fd sha256 Hello.Efi

运行结果:

签名后的文件名称是 Hello-signed.efi 。到现在我们有4个签名相关的文件和2个 EFI 文件,将他们全部copy到U盘上的QEMU目录中(特别注意 U盘必须FAT32格式)。之后使用下面这个 command 启动 QEMU:

qemu-system-x86_64.exe -pflash ovmf_secureboot.fd -hda fat:rw:j:\QEMU -net none

启动后,默认情况下 Secure Boot 是 Disabled,至少需要从 Setup 加入 PK 和 DB 两组 Key【参考1】才能 Enable这个功能:

a.Device Mnager->Secure Boot Configuration切换为 Custom Mode

b.加载 PK 的操作在  Custom Secure Boot Options 中选择 PK Option

c进入之后选择 Enroll PK 通过文件加载 PK

选择盘符

选择 TestRoot.cer 文件

返回后可以看到这个文件已经加载生效了

d.继续加载 DB文件, 操作如下

一个系统中只能有一个 PK,但是可以有多个 DB 文件。这里需要给加载的DB 指定一个 GUID,随便写编一个即可

e.完成设置后返回即可看到 Secure Boot 已经 Enable了。

在 Shell 下测试,因为 Hello.efi 没有签名,所以无法执行,Hello-signed.efi 正确签名了,所以可以运行。

上面就是在 QEMU 下测试 Secure Boot 功能的过程,有兴趣的朋友可以动手试试。

参考:

  1. http://gschwinds.net/cache/SigningUEFIImages-1.31.pdf
  2. https://www.jianshu.com/p/e892733c6f50
  3. 来源同【1】DB和 PK 对于 Secure Boot  Enabling 是必须的

《QEMU 下 SecureBoot 和 EFI 签名的测试》有3个想法

  1. 您好,我最近在搞qemu,我看了您的文章“qemu下的secureboot和efi签名的测试”这篇文章,请问可以把您的编辑好的带有secureboot的efi固件发给我吗,谢谢

  2. 遇到了,自己编译的固件,使用pflash,之后卡在guest not........(yet).就是无法进入,我也不知道怎么回事@_@,所以想找人要一个现成的固件

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注