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

本文详细描述了在Linux系统下加载驱动模块遇到签名错误的解决方法,包括关闭SecureBoot、构建签名环境、使用mokutil导入密钥并签名驱动,以USB转串口驱动CH340为例。

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

方法一、关闭Secure Boot

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

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

方法二、构建签名环境

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

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驱动文件签名:

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

### 密钥被服务拒绝的原因分析 当密钥被服务拒绝时,通常涉及以下几个可能原因: 1. **密钥格式不正确** 如果客户端发送的密钥不符合服务端预期的标准格式,则可能导致验证失败。例如,某些服务要求公钥采用 PEM 或 DER 格式[^1]。 2. **密钥过期或无效** 许多安全协议会对密钥设置有效期。如果密钥已超过其有效期限或者已被标记为无效状态,则会被拒绝访问。 3. **权限不足** 即使提供了有效的密钥,但如果该密钥对应的账户缺乏执行特定操作所需的权限,也会遭到拒绝。 4. **配置错误** 客户端与服务器之间的加密算法、哈希函数或其他安全性参数如果不匹配,也可能引发认证失败的情况。 以下是处理此类问题的一个通用方法实现示例: ```python import requests def check_key_rejection(api_url, headers): try: response = requests.get(api_url, headers=headers) if response.status_code == 401 or response.status_code == 403: error_message = f"The provided key might be invalid or expired: {response.text}" return {"status": "rejected", "message": error_message} elif response.status_code == 200: success_message = "Key accepted successfully." return {"status": "accepted", "message": success_message} else: other_error = f"Unexpected status code received: {response.status_code}" return {"status": "error", "message": other_error} except Exception as e: exception_info = str(e) return {"status": "exception", "message": exception_info} # Example usage api_endpoint = 'https://example.com/api/resource' auth_headers = {'Authorization': 'Bearer YOUR_ACCESS_TOKEN'} result = check_key_rejection(api_endpoint, auth_headers) print(result) ``` 上述脚本可用于测试 API 接口返回的状态码来判断是否存在因密钥问题而产生的拒绝情况,并提供相应的调试信息。 #### 解决方案建议 为了防止未来再次发生类似的密钥拒绝现象,可以采取如下措施: - 确认所使用的密钥是否仍然处于活动期内; - 验证当前环境下的所有依赖库版本号及其兼容性; - 对于生产环境中频繁调用的服务接口实施日志记录机制以便追踪异常行为模式;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PC技术小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值