AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 686292
Accepted
NJP
NJP
Asked: 2022-01-14 21:43:58 +0800 CST2022-01-14 21:43:58 +0800 CST 2022-01-14 21:43:58 +0800 CST

从 Microsoft 签名操作系统加载程序加载 UEFI 自签名内核

  • 772

我正在 UEFI 中编写自己的操作系统加载程序(引导加载程序)。操作系统加载程序是 Microsoft 签名的,因此它可以在安全启动下运行。OS Loader 将能够根据用户的选择加载 Windows 或 Linux Kernel(类似于 GRUB) 因为我将 Linux Kernel 构建为 EFI Stub,所以我可以从我的 OS Loader 加载它。

但是,我有一个具体的要求。我将对 Linux 内核进行自签名。

如何建立信任链以确保我加载的是我自己的自签名 Linux 内核而不是其他未签名的内核?

根据电信公司的建议于 2022 年 1 月 21 日编辑

继续 telcoM 的回答,我从https://github.com/rhboot/shim下载了 SHIM 源,我还在https://www.rodsbooks.com/efi-bootloaders/secureboot.html#initial_shim
之后创建了 PKI 密钥

$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Your Name/"
$ openssl x509 -in MOK.crt -out MOK.cer -outform DER

使用构建的 SHIM 源

make VENDOR_CERT_FILE=MOK.cer

用 MOK.key 签署了我的 kernel.efi 以获得签署的 grubx64.efi(这是因为 SHIM 中的默认加载器是 grubx64.efi。我只是继续使用默认值)

sbsign --key MOK.key --cert MOK.crt --output grubx64.efi  kernel.efi

最后,使用 shimx64.efi 作为 loader.efi (使用 PreLoader https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/)因为目前我没有微软签署的 shimx64.efi . 此外,mmx64.efi 和 fbx64.efi 也通过 HashTool.efi 与 shimx64.efi (loader.efi) 一起注册

这是流程。
PreLoader.efi --> loader.efi(shimx64.efi) --> grubx64.efi(kernel.efi)

禁用 SecureBoot 后,一切正常,我可以启动 Linux 内核。
但是,启用 SecureBoot 后,我​​无法启动 grubx64.efi 映像。

进一步更新

我发现我应该使用 MokManager (mmx64.efi) 来注册 MOK.cer。尝试使用 mmx64.efi 并注册 MOK.cer。但是,看起来 Key 没有成功注册。

我错过了什么吗?

kernel uefi
  • 2 2 个回答
  • 715 Views

2 个回答

  • Voted
  1. Best Answer
    telcoM
    2022-01-15T03:27:46+08:002022-01-15T03:27:46+08:00

    您的操作系统加载程序需要包含您将用于签署自己的内核的密钥的公共部分(也称为证书)的副本。每当该密钥发生更改时,您都需要让您的 OS Loader 由 Microsoft 重新签名。

    您可能想研究shimx64.efi许多主要发行版用来处理安全启动的安全启动 shim 引导加载程序的源代码:

    https://github.com/rhboot/shim


    或者,您必须将内核签名密钥的公共部分的副本添加到dbUEFI NVRAM 变量中。通常这只有在您替换系统上的安全启动主键(PKUEFI NVRAM 变量)时才有可能。这取决于您系统的固件实现如何(或实际上是否)可以做到这一点。

    常见的可能方式:

    1. 如果您的 UEFI 固件设置(“BIOS 设置”)包含直接编辑安全启动密钥库的方法,则可用于将内核签名密钥直接添加到db变量中。您可能必须先重置或更换PK主键,见下文。

    2. 如果您的 UEFI 固件设置不包括直接编辑安全启动密钥库的方法,但包括将PK安全启动的主密钥归零的方法,这足以让您入门。在Secure Boot Setup ModePK中将 Secure Boot 的位置清零,在该模式下可以启动任何内核并且可以编辑所有 Secure Boot 密钥库。当新的安全启动主密钥(即类似于为安全启动签署内核所使用的数字证书)存储到密钥库变量时,设置模式结束。PK

    在安全启动设置模式下,所有安全启动密钥库都应可由操作系统级程序编辑,例如efivar https://github.com/vathpela/efivar.git或sbsigntools https://git.kernel.org/pub/scm/例如linux/kernel/git/jejb/sbsigntools.git。在实践中,这并不总是有效;它取决于系统特定固件中 UEFI 实现的属性。

    如果您的固件不允许通过操作系统级程序编辑安全启动密钥库,您可能会使用 UEFI 模式工具获得更好的运气,例如包KeyTool.efi中的: https ://git.kernel.org/pub/scm/linux/内核/git/jejb/efitools.gitefitools

    (可以保护 UEFI NVRAM 变量,以便它们只能由启动时.efi程序访问,而不是由常规操作系统访问;我已经看到一些 UEFI 实现似乎以这种方式限制安全启动密钥库,尽管安全启动规范没有要求。)

    • 3
  2. Alex Baranowski
    2022-01-15T01:33:39+08:002022-01-15T01:33:39+08:00

    为了安全启动,您可以将您的密钥添加到“机器所有者密钥”密钥库中。Scientific Linux 过去使用以下命令来完成。

    cd /tmp
    curl http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt | openssl x509 -inform der  > DigiCertEVCodeSign.pem
    curl http://cacerts.digicert.com/DigiCertEVCodeSigningCA-SHA2.crt  | openssl x509 -inform der >> DigiCertEVCodeSign.pem
    curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27.pem
    curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26.pem
    curl http://ftp.scientificlinux.org/linux/scientific/7x/x86_64/os/SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26 | openssl x509 -inform der > SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26.pem
    
    certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27.pem
    certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2020-08-26.pem
    certtool -V --verify --load-ca-certificate=DigiCertEVCodeSign.pem --infile=SECURE-BOOT-KEY-fnal-sl7-exp-2017-07-26.pem
    # use mokutil to import 
    mokutil --import /etc/pki/secure-boot/SECURE-BOOT-KEY-fnal-sl7-exp-2023-09-27
    

    负责操作机器所有者密钥库的命令是mokutil.

    来源: http: //ftp.scientificlinux.org/linux/scientific/7.9/x86_64/release-notes/#_about_uefi_secure_boot

    • 1

相关问题

  • /proc/net/wireless 如何是 /proc/net/dev 的“克隆”?

  • Linux Mint 内核损坏

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

  • 通过标签将根文件系统传递给linux内核

  • 以 root 用户身份访问文件系统

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve