https://github.com/jakeday/linux-surface/blob/master/SIGNING.md有关内核签名的更具体说明(改编自接受答案中的相同教程)。完整的说明如下:
为安全启动签名自定义内核
这些说明适用于Ubuntu,但对于使用shim和grub作为引导加载程序的其他发行版也应该类似。如果您的发行版没有使用shim(例如Linux Foundation Preloader),则应该有完成签名的类似步骤(例如使用HashTool代替LF Preloader的MokUtil),或者您可以安装shim来替代。Ubuntu的shim软件包名为shim-signed
,但请确保正确安装它,以免损坏引导加载程序。
自Ubuntu最近的GRUB2更新(2.02+dfsg1-5ubuntu1)以来,只要启用了安全启动,GRUB2就不再加载未签名的内核。Ubuntu 18.04的用户在升级grub-efi软件包时会收到通知,提示该内核未经过签名,升级将中止。
因此,您有三种解决这个问题的选择:
1. 您自己签署内核。
2. 使用您发行版的已签名通用内核。
3. 禁用安全启动。
由于第二和第三个选项实际上并不可行,以下是自己签署内核的步骤。
指令改编自
Ubuntu博客。在执行之前,请备份/boot/EFI目录,以便可以恢复所有内容。请自行承担风险执行以下步骤。
1. 创建用于创建签名密钥的配置文件,保存为mokconfig.cnf:
# This definition stops the following lines failing if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3
string_mask = utf8only
prompt = no
[ req_distinguished_name ]
countryName = <YOURcountrycode>
stateOrProvinceName = <YOURstate>
localityName = <YOURcity>
0.organizationName = <YOURorganization>
commonName = Secure Boot Signing Key
emailAddress = <YOURemail>
[ v3 ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage = codeSigning,1.3.6.1.4.1.311.10.3.6
nsComment = "OpenSSL Generated Certificate"
将所有带有的部分调整为您的详细信息。
2. 创建用于签署内核的公钥和私钥:
openssl req -config ./mokconfig.cnf \
-new -x509 -newkey rsa:2048 \
-nodes -days 36500 -outform DER \
-keyout "MOK.priv" \
-out "MOK.der"
将密钥也转换为PEM格式(mokutil需要DER,sbsign需要PEM)。
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
4. 将密钥注册到您的垫片安装中:
sudo mokutil --import MOK.der
您将被要求输入密码,您只需在下一步中使用它来确认您的密钥选择,因此可以选择任意密码。
- 重新启动您的系统。您将遇到一个名为MOKManager的工具的蓝色屏幕。
选择“注册MOK”,然后选择“查看密钥” 。确保它是您在第2步创建的密钥。
之后继续过程,您必须输入您在第4步提供的密码。继续引导您的系统。
注意:如果MOKManger在重启时未加载,则请更改启动顺序。link
- 通过以下方式验证您的密钥已注册:
sudo mokutil --list-enrolled
签署您安装的内核(应位于 /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface):
sudo sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface --output /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface.signed
复制未签名内核的initram,这样我们也会有一个已签名内核的initram。
sudo cp /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{,.signed}
9. 更新你的 grub 配置文件。
sudo update-grub
重启您的系统并选择已签名的内核。如果引导成功,您可以删除未签名的内核:
sudo mv /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo mv /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo update-grub
现在您的系统应该在已签名的内核下运行,并且可以再次升级GRUB2。如果您想升级自定义内核,只需按照上述步骤从第七步开始再次签署新版本即可。请确保备份MOK密钥(MOK.der、MOK.pem、MOK.priv)。