我正在使用自己的密钥(PK、KEK 和 DB)配置安全启动。到目前为止我已经做了一切:
- 构建统一内核映像 (UKI)
- 制作独立的 GRUB 二进制文件
- 生成自己的 PK、KEK 和 DB 密钥;签署了 GRUB 和 UKI。
我可以在启用安全启动的情况下启动到 GRUB 和 Linux。但我也双启动 Windows,这就是问题开始的地方。到目前为止,我已尝试使用我的 PK 签署 Microsoft KEK CA,但我的笔记本电脑(Dell Precision 7740)拒绝将其附加到 KEK,因为它“未正确签名”。另一个问题是 Microsoft DB 签名证书。我不确定应该如何处理它,它是否已由 Microsoft KEK 签名,还是我应该使用自己的 KEK 签名?
下面我列出了我用来生成证书的命令以及我为导入 Microsoft 证书而尝试执行的操作。
生成密钥:
mkdir certs
cd certs
uuidgen --random > GUID.txt
openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=example PK/" -out PK.crt
openssl x509 -outform DER -in PK.crt -out PK.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=example KEK/" -out KEK.crt
openssl x509 -outform DER -in KEK.crt -out KEK.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=example DB/" -out db.crt
openssl x509 -outform DER -in db.crt -out db.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
注意:我将我的实际 CN 名称替换为example
因为我不想分享它的名称。
我尝试使用 Microsoft 证书做什么:
# Certificates in PEM format are in the .crt files. I do this conversion, because otherwise some of the command below would fail and .auth file would not contain almost anything, only around ~30 bytes of arbitrary data)
openssl x509 -in microsoft_kek_ca_2011-06-24.bin -out microsoft_kek_ca_2011-06-24.crt
openssl x509 -outform DER -in microsoft_kek_ca_2011-06-24.crt -out microsoft_kek_ca_2011-06-24.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" microsoft_kek_ca_2011-06-24.cer microsoft_kek_ca_2011-06-24.esl
# Here I actually sign it. I don't get any errors and .auth file in size looks similar to other .auth files. But my Laptop still refuses to import it.
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK microsoft_kek_ca_2011-06-24.esl microsoft_kek_ca_2011-06-24.auth
openssl x509 -in microsoft_windows_pca_2011-10-19.bin -out microsoft_windows_pca_2011-10-19.crt
openssl x509 -outform DER -in microsoft_windows_pca_2011-10-19.crt -out microsoft_windows_pca_2011-10-19.cer
cert-to-efi-sig-list -g "$(< GUID.txt)" microsoft_windows_pca_2011-10-19.cer microsoft_windows_pca_2011-10-19.esl
# Here I gave up, the issue is that I need signed efi list (.auth) in order to import it to my BIOS. But in order to create signed list I would need KEK keys, and obvisly I don't own keys to Microsoft KEK, so I just tried signing it with my own KEK. Again, BIOS refuses to import it.
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db microsoft_windows_pca_2011-10-19.esl microsoft_windows_pca_2011-10-19.auth
注意:我从以下位置下载了 Microsoft 的 KEK 和 DB官方文档。
作为结束语,我想说我不愿意使用 SHIM 或 MOK,因为我需要并且想要拥有自己的 PK、KEK 和 DB 密钥所提供的控制权。我认为 SHIM/MOK 是半生不熟的/解决方法。而且它并没有真正解决问题。而是给出了一个肮脏的修复。
提前感谢您的帮助!
答案1
好吧,虽然我没有成功签署微软的 KEK,但我只是用我的密钥强制重新签署了 esp/EFI/Microsoft/Boot/bootmgr.efi 和 esp/EFI/Microsoft/Boot/bootmgtf.efi 。是的,在 Windows 更新之后,我可能需要重新签名,但我禁用了自动更新,并且这些文件不应该更新得太频繁。