openSUSE:UEFI 安全启动使用 qemu-kvm

跳转到:导航搜索
Icon-cleanup.png
这篇文章需要关注,因为它不符合我们的维基指南
如果您想贡献,请阅读此维基的规则,如果您有任何问题,请随时联系维基团队,我们非常乐意帮助您!:-)

基于 James Bottomley <James.Bottomley@parallels.com> 的方法

准备环境

准备一台 openSUSE 12.2 机器

是的!只需使用 openSUSE 12.2 DVD 安装一台机器。请记住需要使用 64 位 openSUSE,因为 Jeremy 的 efi 签名工具仅真正处理 x86_64 二进制文件。

安装 OVMF

添加 James 的 repo 到 OBS

zypper ar -f -n UEFI http://download.opensuse.org/repositories/home:/jejb1:/UEFI/openSUSE_12.2/home:jejb1:UEFI.repo

OVMF 是从 EDK2 构建的 UEFI BIOS 镜像,由 qemu-kvm 使用,让我们安装它

 # zypper in OVMF

构建 James 的 efitools

James 的 git 有一个 efitools 集合用于测试 UEFI 安全启动。克隆它

 # cd ~/
 # git clone git://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git

在编译之前,请安装标准的开发环境 gnu-efi、help2man 和 sbsigntools 以及 efitools 使用的 libopenssl-devel 库,最后当然还需要 gcc 和 make

 # zypper in gnu-efi help2man sbsigntools gcc make libopenssl-devel

然后,是的,编译它

 # cd ~/efitools
 # make

请确保生成以下 .efi 文件

# ls *.efi
HelloWorld.efi  HelloWorld-signed.efi  LockDown.efi  LockDown-signed.efi

为 Qemu 准备 hda

我们需要将 PK/KEK/DB 导入到 UEFI BIOS 中进行安全启动测试,并且还需要运行一些 *.efi 可执行文件来验证安全性。因此,我们应该准备一个 hda 内容文件夹,然后将其提供给 qemu-kvm

# cd ~/
# mkdir hda-contents

将 PK.crt、KEK.crt 和 *.efi 文件从 efitools 文件夹复制到 ~/hda-contents

# cd ~/hda-contents
# cp ~/efitools/KEK.crt ~/efitools/DB.crt ~/efitools/PK.crt ~/efitools/*.efi ./
# ls ~/hda-contents

DB.crt HelloWorld.efi HelloWorld-signed.efi KEK.crt LockDown.efi LockDown-signed.efi PK.crt

由于 openSUSE 证书是 PEM 格式,我们需要转换为 DER 格式才能注册到 UEFI BIOS

# openssl x509 -in KEK.crt -outform DER -out KEK.der
# openssl x509 -in PK.crt -outform DER -out PK.der
# openssl x509 -in DB.crt -outform DER -out DB.der

使用 UEFI 启动 qemu-kvm

OVMF rpm 的 BIOS 镜像文件夹位于 /usr/share/qemu-ovmf/bios 

linux-8wu0:~/efitools # rpm -ql OVMF
/usr/share/qemu-ovmf
/usr/share/qemu-ovmf/README
/usr/share/qemu-ovmf/bios
/usr/share/qemu-ovmf/bios/bios.bin
/usr/share/qemu-ovmf/bios/vgabios-cirrus.bin
/usr/share/qemu-ovmf/efi
/usr/share/qemu-ovmf/efi/HelloWorld.efi

运行 qemu-system-x86_64 启动虚拟机

# qemu-system-x86_64 -L /usr/share/qemu-ovmf/bios -hda fat:hda-contents/

启动进度完成后,将看到 UEFI shell 提示符显示如下

测试安全启动

启用安全启动

关闭 UEFI shell,然后进入 UEFI 配置菜单

Shell> exit

进入安全启动模式选项

Device Manager >> Secure Boot Configuration >> Secure Boot Mode

将其更改为“自定义模式”

After change to "Custom Mode", will show up Custom Secure Boot Options

导入 PK/KEK

导入 PK

请进入以下选项

Custom Secure Boot Options >> PK Options >> Enroll PK >> Enroll PK Using File

选择唯一一个 HD 空间

选择 PK.der

选择“提交更改并退出”,然后 PK 将导入到 UEFI BIOS 中的 DB 中。

导入 KEK

过程与 PK 相同,只需使用“KEK 选项”

Custom Secure Boot Options >> KEK Options >> Enroll KEK >> Enroll KEK Using File

然后选择“KEK.der”文件,不要忘记“提交更改并退出”!

执行 LockDown.efi

如果找不到 PK.cer 文件,请退出 QEMU 并重新启动(重新执行使用 UEFI 启动 qemu-kvm)

选择“继续”,输入“fs0:” 然后输入“LockDown.efi”。

当您在“efitools”文件夹中键入 make 时,它将生成一组密钥并将它们放置在一个名为 LockDown.efi 的二进制文件中。执行此 efi 二进制文件会将所有密钥置备并将平台置于启用安全启动的用户模式(从那时起,它将仅执行已签名的 efi 二进制文件)

运行 .efi 文件

好的!现在我们导入了 PK 和 KEK,这意味着我们启用了安全启动。然后,我们可以运行 HelloWorld efi 来验证它。

按 ESC 返回 UEFI 主菜单,选择

Boot Manager >> EFI Internal Shell

您将再次看到 EFI shell 提示符。

然后我们需要进入 hda-contents,因为我们的 *.efi 可执行文件放在那里。键入 fs0 然后按 Enter 键,就像 DOS 一样

Shell> fs0:
fs0:\> 

您可以使用 ls 或 dir 列出 fs0 中的所有文件

有两个 HelloWorld* efi 文件,一个是未签名的,另一个是已签名的。

运行 HelloWorld.efi

fs0:\> HelloWorld.efi
Error reported: Access Denied

是的,它会显示“访问被拒绝”

运行 HelloWorld-signed.efi

fs0:\> HelloWorld-signed.efi
Hello World!

好的,通过了!

禁用安全启动

然后您可以尝试该选项以临时禁用安全启动

Device Manager >> Secure Boot Configuration >> Attempt Secure Boot [x]

按 Enter 键删除“尝试安全启动”上的 [x]。返回 shell 提示符以运行 HelloWorld.efi,您会发现它可用了,现在。

根据 Insyde 的信息,此选项的代码路径与“启用安全启动”完全相同,只是它忽略了安全启动检查的结果。

运行 openSUSE

为了让 openSUSE 运行,DB.crt 和 KEK.crt 密钥必须替换为公共 Microsoft 密钥

# cd ~/hda-contents
# wget http://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
# wget http://www.microsoft.com/pkiops/certs/MicCorKEKCA2011_2011-06-24.crt

现在获取您选择的 openSUSE 镜像,使用 qemu-img 准备一个虚拟硬盘,然后再次启动 qemu

# qemu-system-x86_64 -L /usr/share/qemu-ovmf/bios -hda [your virtual harddisk] -cdrom [your iso img] -hdb fat:~/hda-contents/

现在像 #Import PK/KEK 部分中描述的那样注册 PK 密钥:'PK.der'(如果您不想创建自己的 PK,可以使用 KEK 密钥,但最好创建自己的 PK),KEK 密钥:'MicCorKEKCA2011_2011-06-24.crt' 和 DB 密钥:'MicCorUEFCA2011_2011-06-27.crt'。(注意用于标识 Microsoft 77fa9abd-0359-4d32-bd60-28f4e78f784b 的 GUID)

# now boot

请注意,在安装设置的启动部分,您可能需要手动设置选项为“启用安全启动:true”

openSUSE CA

对于 openSUSE CA,获取它的公共空间来自 shim RPM 源代码在 OBS 上:devel:openSUSE:Factory > shim

由于 openSUSE 证书是 PEM 格式,我们需要转换为 DER 格式才能注册到 UEFI BIOS

# openssl x509 -inform PEM -in openSUSE-UEFI-CA-Certificate.crt -outform DER -out openSUSE-UEFI-CA-Certificate.der
# openssl x509 -inform PEM -in openSUSE-UEFI-SIGN-Certificate.crt -outform DER -out openSUSE-UEFI-SIGN-Certificate.der
  • *UEFI-CA*.der 是注册到 UEFI BIOS 中 KEK 数据库的证书。
  • *UEFI-SIGN*.der 是注册到 UEFI BIOS 中 db 数据库的证书。

然后按照此过程注册它们:注册 PK、KEK 和 db

如果您想测试 openSUSE 签名的 shim,请安装 shim 包,它包含以下文件

# rpm -ql shim
  /usr/lib64/efi
  /usr/lib64/efi/MokManager.efi
  /usr/lib64/efi/shim-opensuse.der
  /usr/lib64/efi/shim-opensuse.efi
  /usr/lib64/efi/shim.efi

请将 shim-opensuse.efi 和 shim.efi(由 Microsoft 签名)复制到 hda-contents,然后启动 OVMF 的 kvm

# qemu-kvm -L /usr/share/qemu-ovmf/bios -hda fat:<absolute_path_to_user_home_directory>/hda-contents/

切换到 shell 控制台中的 fs0:,然后我们可以测试 openSUSE CA 在签名 shim 上是否有效。

其他发行版的差异