openSUSE:UEFI 安全启动使用 qemu-kvm
基于 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 二进制文件)
运行 LockDown.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 上是否有效。








