Linux系统解决“Key was rejected by service”

Linux系统下加载驱动模块出现如上错误提示的原因为:此驱动未经过签名。

方法一、关闭Secure Boot

如果是物理机,需要开机进入BIOS,找到"Secure Boot"的选项,然后关闭。

如果是虚拟机,可以打开虚拟设置,在如下选项中选择"",如下所示:

方法二、构建签名环境

1、安装软件包mokuli 和shim-signed

bash 复制代码
sudo apt install mokutil
sudo apt install shim-signed
sudo update-secureboot-policy --new-key

2、创建一个公共/私有RSA密钥对来对内核模块进行签名。以下示例将密钥对存储在/root/module-signing/目录中

复制代码
sudo -i
mkdir /root/module-signing
cd /root/module-signing
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOUR_NAME/"
chmod 600 MOK.priv 

3、使用mokutil,一种导入或删除机器所有者密钥(MOK)的工具,导入公钥,然后在机器重新启动时注册它。此步骤中的密码需要记住,系统重启的时候需要输入。(删除公钥也需要此密码)

复制代码
mokutil --import /root/module-signing/MOK.der
input password:
input password again:

注:如果执行此步骤遇到错误:EFI variables are not supported on this system,是因为此机器没有开启UEFI,如是物理机直接修改BIOS,如果是VMware虚拟机,则需要在虚拟机设置里开启。如下所示:

4、重新启动机器。当引导程序启动时,会看到一个屏幕,要求按下按钮进入MOK管理器EFI实用程序。请注意,在此步骤中,任何外部外部键盘都无法工作。在第一个菜单中选择Enroll MOK,然后继续,然后选择Yes以注册密钥,并重新输入步骤3中创建的密码。然后选择"确定"继续系统引导。

5、系统重启后,就可以使用公钥对目标驱动模块签名了,这里以USB转串口芯片CH340的Linux驱动模块ch341.ko为例,签名前的驱动模块信息:

使用如下命令对ch341.ko驱动文件签名:

bash 复制代码
1. sudo -i
2. /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /root/module-signing/MOK.priv /root/module-signing/MOK.der ch341.ko 

查看签名后的驱动模块信息:

当驱动模块信息中包含"Module signature appended"信息,则说明驱动已经签名成功了。此时再加载驱动就不会提示:"Key was rejected by service"。

注:如未来内核更新将需要再次对更新后的内核进行签名,因此可以将签名命令放入脚本中,该脚本可以在以后根据需要运行。

参考:virtualbox - How to sign a kernel module Ubuntu 18.04 - Super User

相关推荐
Ray Song4 天前
cgroup 实战从0到1
linux内核·cgroup·系统资源控制
妖怪喜欢风5 天前
内存映射:map_memory宏作用分析
linux内核·内存映射·linux源码
予枫的编程笔记10 天前
【Docker高级篇】吃透容器编排:Swarm vs K8s 核心差异,为后续K8s学习打牢基础
docker·云原生·kubernetes·linux内核·容器编排·容器技术·运维技术
予枫的编程笔记14 天前
【Linux高级篇】搞定文件句柄+TIME_WAIT,Linux内核初步调优实操指南
linux·linux运维·ulimit·time_wait·sysctl.conf·内核调优·服务器优化
新兴AI民工18 天前
【Linux内核二十】进程管理模块:CFS调度器enqueue(七):enqueue_entity函数的收尾
linux·服务器·linux内核·内核代码学习
皮皮哎哟19 天前
Linux文件IO与目录IO编程深度解析:从系统调用到实战应用
开发语言·linux内核·文件io·目录io·时间相关接口·c预言
予枫的编程笔记19 天前
【Linux高级篇】系统级vs用户级Crontab:区别在哪?实战配置一步到位
定时任务·linux命令·linux运维·crontab·运维干货·crontab陷阱·linux实战
予枫的编程笔记22 天前
【Linux进阶篇】Linux后台运行避坑指南:nohup、& 用法及Systemd守护进程实操
linux·进程管理·linux运维·nohup·systemctl·ps命令·kill命令
予枫的编程笔记23 天前
【Linux入门篇】Linux运维必学:Vim核心操作详解,告别编辑器依赖
linux·人工智能·linux运维·vim操作教程·程序员工具·编辑器技巧·新手学vim
予枫的编程笔记23 天前
【Linux入门篇】摆脱权限混乱困境:Linux用户组管理+sudo提权,一步到位
linux·linux运维·后端开发·linux用户管理·linux权限配置·chmod命令·sudo配置