同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
UEFI 是BIOS 的新版本,他有更多现代功能。有一项就是支持安全启动。所谓安全启动是根据密钥来验证启动文件是否有受认可的签名,然后才允许启动。
这将防止针对启动的安全攻击。如果启动被替换为一个非安全的代码,那么之后的任何防护都是毫无意义的。
厂商默认会内置支持 windows 的安全密钥,但是对于广大的第三方启动系统,如linux ,grub,pe 盘之类的,就不那么友好了。
解决的思路是:
这里,重点介绍第一种方法。
公钥体系:
公钥和私钥是一对匹配的密钥,由公钥加密的内容,私钥可以解密,反之成立。私钥就是保密的密钥,公钥就是公开发布给第三方的密钥。然后就能进行:
PK 就是主板厂家自己的密钥。
KEK 是微软这些系统商家的密钥。用PK签名KEK,就允许了他的下级证书生效。
db 是微软代理商(OEM)的签名密钥。
dbx 是一些失效或者泄露的密钥的黑名单。
也就是,比如你购买一个 windows 光盘,他的启动映像是被微软签名的。微软和主板厂家有py交易,所以主板会内置微软的证书。因而系统可以正常启动。
如果你购买一台品牌电脑,他的windows 系统是经过 OEM 供应商修改的,捆版一些软件之类的,这时候微软不可能替它签名,不过 OEM 厂家和微软也有py交易。OEM的证书会被微软签名。因而也能正常启动。
linux 和微软没关系,和主板厂家也没关系,所以它只能关闭安全启动。
但是,如果我们替换了 PK,下面想怎么干就怎么干了。
这就是下面我们要做的。
主板一般有保存到 U 盘的功能。也就是保存为四个文件(请更名):
或者进入系统(efitools包):
efi-readvar -v PK -o old_PK.esl
同样方法保存四个变量即可。
证书格式有很多种,主流的是 X.509 格式。
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=htqx's kernel-signing key/" -keyout db.key -out db.crt -days 3650 -nodes -sha256
其中:
同样的方法,依次创建:
要让证书逻辑上组成树状结构(上下级),就需要对其进行签发。
# PK
cert-to-efi-sig-list -g "$(uuidgen)" PK.crt PK.esl
sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.auth
# KEK
cert-to-efi-sig-list -g "$(uuidgen)" KEK.crt KEK.esl
sign-efi-sig-list -a -k PK.key -c PK.crt KEK KEK.esl KEK.auth
# db
cert-to-efi-sig-list -g "$(uuidgen)" db.crt db.esl
sign-efi-sig-list -a -k KEK.key -c KEK.crt db db.esl db.auth
# dbx
sign-efi-sig-list -k KEK.key -c KEK.crt dbx old_dbx.esl old_dbx.auth
解释:
有些 BIOS 可能不支持添加模式,这时候需要手动创建捆绑包:
cat old_KEK.esl KEK.esl > compound_KEK.esl
sign-efi-sig-list -k PK.key -c PK.crt KEK compound_KEK.esl compound_KEK.auth
有些BIOS 支持添加独立证书(也就不用转换为 UEFI专用格式了)。独立证书制作只是简单的转换为 DER 标准格式:
证书规范(内容):
编码规范:
证书后缀名含义:
openssl x509 -outform DER -in PK.crt -out PK.cer
重启进入 BIOS 设置:
这时有些BIOS 可以添加密钥。
或进入系统(安装组合密钥):
efi-updatevar -e -f old_dbx.esl dbx
efi-updatevar -e -f compound_db.esl db
efi-updatevar -e -f compound_KEK.esl KEK
若失败可以回退:
efi-updatevar -e -f old_dbx.esl dbx
efi-updatevar -e -f old_db.esl db
efi-updatevar -e -f old_KEK.esl KEK
另一种修改方法(附加密钥):
efi-updatevar -a -c db.crt db
efi-updatevar -a -c KEK.crt KEK
最后设置 PK(注意顺序的重要性),进入正常模式:
efi-updatevar -f PK.auth PK
BIOS 支持用户证书,甚至是启动时临时插入,即第五个变量:
微软曾经给 linux 签发过一个 shim 启动器,但这个启动器本身并不支持启动任意程序(这样不安全),但支持 MOK ,即用户自行添加的密钥验证。
shim 启动器的常规文件名(名字可以改):
mok管理器:
当使用 shim 启动时,它会识别经过签名的下级启动器(grubx64.efi 等),如果下级启动器的签名不在 MOK,它会启动一个 mok 管理界面,提示用户插入证书。(ventoy U盘多系统引导就是采用类似技术)
系统中管理 MOK(mokutil包):
# 添加用户证书 (这个证书必须是x509 v3版)
mokutil -i /boot/efi/EFI/refind/keys/refind_local.cer
为了让 shimx64.efi 启动,需要在引导创建一个启动项(efibootmgr包):
lsblk # 查看 efi 盘路径在哪里(以efi盘为根目录)
efibootmgr -c -L shim -d /dev/nvme0n1 -p 1 -l /efi/shim/shimx64.efi
efibootmgt -v # 查看详情
说明:
然后将 grubx64.efi 和 mokmanager.efi 之类的工具放在同一个目录, shim 引导器就会自动加载。
注意:安全启动是一个完整的链条,grub 也要签名,grub 的模块也要签名,linux 内核也要签名,linux 内核模块也要签名, linux 镜像里面的内核模块也要签名。
内核编译选项(选中):
手动签名模块:
/lib/modules/${KV_FULL}/build/scripts/sign-file sha256 /etc/efikeys/MOK.key /etc/efikeys/MOK.der /lib/modules/${KV_FULL}/${libdir}/${modulename}.${KV_OBJ}
意思是在内核模块目录中找到签名工具,添加私钥和公钥,签名模块文件。
其中 ${KV_FULL} 这些变量替换为你实际的路径名字。
手动签名内核本身(sbsigntool包):
sbsign --key /etc/efikeys/MOK.key --cert /etc/efikeys/MOK.crt /boot/vmlinuz --output /boot/vmlinuz
意思是使用私钥和公钥(用你自己的来替换路径),签名 /boot/vmlinuz 的内核文件,输出签名后的结果。
首先对 grub 自身(grubx64.efi)进行前面。然后grub 配置为支持安全启动,这时候它就要求加载的文件(配置,模块之类的需要验证)。grub使用的验证技术并不是 x509,而是 pgp,可以安装开源软件 gpg 来创建相关密钥。
# 转换密钥格式
# 将公钥和私钥转换为 p12 格式
openssl pkcs12 --export -in db.crt -inkey db.key -out db.p12
# monkeysphere 包
# 转换私钥格式
cat db.key | PEM2OPENPGP_USAGE_FLAGS=authenticate,sign,certify,encrypt pem2openpgp "htqx <htqx@xxx.com>" | gpg --import db.pgp
# 导出备用, 注意 htqx 这个用户名可能会有重复,可以用指纹代替
gpg --export htqx > htqx.pgp # 证书
gpg -u htqx --sign htqx.pgp # grub 默认要求对证书进行签名
# 输出 htqx.pgp.gpg (使用这个)
gpg --export-secret-keys htqx > htqx.pgp.key # 私钥
重新安装 grub 引导文件,配置安全检查:
# 安装 grub 引导
sudo grub-install -k htqx.pgp --modules=tpm --target=x86_64-efi --efi-directory=/boot/efi
注意:有些版本的 grub 内置了一个shim 启动选项,只要开启密钥的时候,它会安装shim 和mokmanager。
# 签名grub
sbsign --key /etc/efikeys/MOK.key --cert /etc/efikeys/MOK.crt /boot/efi/EFI/gentoo/grubx64.efi --output /boot/efi/EFI/shim/grubx64.efi
# 签名 grub 模块
for i in `find /boot -name "*.cfg" -or -name "*.lst" -or \
-name "*.mod" -or -name "vmlinuz*" -or -name "initramfs*" -or \
-name "grubenv" | grep -Ev "\.sig$"`;
do
# -u 指定密钥用户
# --batch 批量
# --detach-sign 分离式签名,产生 *.sig
gpg --local-user htqx --batch --detach-sign $i
done
#
注意,gpg 密钥保存在用户目录 ~/.gungp/ 下,所以如果不是管理员账户,那么就要将密钥导入到管理员 root 账户内。才能使用脚本。
重点:
总结: 麻烦且用处不大,除非无法关闭安全启动,或者系统对安全启动做了集成。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。