出现 “Key was rejected by service” 错误,通常是由于启用了内核模块签名验证,而你尝试加载的模块没有被正确签名。Linux 内核从 4.4 版本开始对模块进行了签名验证以确保系统安全,特别是在使用安全启动(Secure Boot)时,内核会拒绝加载未签名或不受信任的模块。

解决这个问题有几种方法:

方法1:禁用安全启动(Secure Boot)

如果你在使用安全启动,可以禁用它,这样内核将不会进行模块签名的验证。

  1. 重启电脑并进入BIOS设置界面。
  2. 找到与安全启动相关的选项(通常在“Security”或“Boot”菜单中),并将其设置为Disabled
  3. 保存设置并重新启动。

禁用安全启动后,你应该可以加载未签名的模块。

方法2:签名内核模块

如果不想禁用安全启动,你可以选择自己对内核模块进行签名。以下是步骤:

  1. 生成签名密钥
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(公钥)。

  1. 使用私钥对模块进行签名
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der ch341.ko
  1. 将密钥添加到系统的可信模块中
    使用mokutil工具将签名密钥注册到系统中:
sudo mokutil --import MOK.der

你将被要求设置一个密码,稍后重启系统时会用到。

  1. 重启系统并完成密钥注册
    在重启后,系统会进入MOK管理界面。在此界面中,选择“Enroll MOK”,并使用之前设置的密码注册密钥。
  2. 加载模块
    注册密钥后,你可以尝试再次加载模块:
sudo insmod ch341.ko

方法3:临时禁用模块签名验证

你还可以在不关闭安全启动的情况下临时禁用模块签名验证:

  1. 编辑/etc/default/grub
sudo nano /etc/default/grub
  1. 找到包含GRUB_CMDLINE_LINUX_DEFAULT的行并添加module.sig_enforce=0参数。例如:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash module.sig_enforce=0"
  1. 更新GRUB:
sudo update-grub
  1. 重启系统,然后再次尝试加载模块。

这些方法应该可以帮助你解决这个签名问题。