出现 “Key was rejected by service” 错误,通常是由于启用了内核模块签名验证,而你尝试加载的模块没有被正确签名。Linux 内核从 4.4 版本开始对模块进行了签名验证以确保系统安全,特别是在使用安全启动(Secure Boot)时,内核会拒绝加载未签名或不受信任的模块。
解决这个问题有几种方法:
方法1:禁用安全启动(Secure Boot)
如果你在使用安全启动,可以禁用它,这样内核将不会进行模块签名的验证。
- 重启电脑并进入BIOS设置界面。
- 找到与安全启动相关的选项(通常在“Security”或“Boot”菜单中),并将其设置为
Disabled
。 - 保存设置并重新启动。
禁用安全启动后,你应该可以加载未签名的模块。
方法2:签名内核模块
如果不想禁用安全启动,你可以选择自己对内核模块进行签名。以下是步骤:
- 生成签名密钥:
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Module Key/"
这会生成两个文件:MOK.priv
(私钥)和 MOK.der
(公钥)。
- 使用私钥对模块进行签名:
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der ch341.ko
- 将密钥添加到系统的可信模块中:
使用mokutil
工具将签名密钥注册到系统中:
sudo mokutil --import MOK.der
你将被要求设置一个密码,稍后重启系统时会用到。
- 重启系统并完成密钥注册:
在重启后,系统会进入MOK
管理界面。在此界面中,选择“Enroll MOK”,并使用之前设置的密码注册密钥。 - 加载模块:
注册密钥后,你可以尝试再次加载模块:
sudo insmod ch341.ko
方法3:临时禁用模块签名验证
你还可以在不关闭安全启动的情况下临时禁用模块签名验证:
- 编辑
/etc/default/grub
:
sudo nano /etc/default/grub
- 找到包含
GRUB_CMDLINE_LINUX_DEFAULT
的行并添加module.sig_enforce=0
参数。例如:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash module.sig_enforce=0"
- 更新GRUB:
sudo update-grub
- 重启系统,然后再次尝试加载模块。
这些方法应该可以帮助你解决这个签名问题。