最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样。这个问题可以说不算是android的问题,而应该是linux系统的问题,android本身就是个linux系统。

下来一步一步分析问题的所在。

内核配置

内核从3.7后开始支持模块签名,这个功能使能以后,内核只允许安装特定key签名的模块。
内核配置项

CONFIG_MODULE_SIG=y

表示开启了签名机制,但是这时候模块签名或不签名都可以使用。

CONFIG_MODULE_SIG_FORCE=y

如果上述配置项使能,则模块必须有正确的签名才能正常使用。

CONFIG_MODULE_SIG_ALL=y

内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。
查看内核配置文件,发现上面3个配置项确实都打开了,因此肯定是ko签名的问题。

内核如何签名

在内核kernel/kernel下的Makefile中有如下:

signing_key.priv signing_key.x509: x509.genkey@echo "###"@echo "### Now generating an X.509 key pair to be used for signing modules."@echo "###"@echo "### If this takes a long time, you might wish to run rngd in the"@echo "### background to keep the supply of entropy topped up.  It"@echo "### needs to be run as root, and uses a hardware random"@echo "### number generator if one is available."@echo "###"openssl req -new -nodes -utf8 -$(CONFIG_MODULE_SIG_HASH) -days 36500 \-batch -x509 -config x509.genkey \-outform DER -out signing_key.x509 \-keyout signing_key.priv 2>&1@echo "###"@echo "### Key pair generated."@echo "###"x509.genkey:@echo Generating X.509 key generation config@echo  >x509.genkey "[ req ]"@echo >>x509.genkey "default_bits = 4096"@echo >>x509.genkey "distinguished_name = req_distinguished_name"@echo >>x509.genkey "prompt = no"@echo >>x509.genkey "string_mask = utf8only"@echo >>x509.genkey "x509_extensions = myexts"@echo >>x509.genkey@echo >>x509.genkey "[ req_distinguished_name ]"@echo >>x509.genkey "O = Magrathea"@echo >>x509.genkey "CN = Glacier signing key"@echo >>x509.genkey "emailAddress = slartibartfast@magrathea.h2g2"@echo >>x509.genkey@echo >>x509.genkey "[ myexts ]"@echo >>x509.genkey "basicConstraints=critical,CA:FALSE"@echo >>x509.genkey "keyUsage=digitalSignature"@echo >>x509.genkey "subjectKeyIdentifier=hash"@echo >>x509.genkey "authorityKeyIdentifier=keyid"

其中,x509.genkey是生成key pair时的配置项,signing_key.priv signing_key.x509分别为private key和数字证书。数字证书会打包进内核,里面有公钥等,用来解密嘛。每编译一次,虽然配置文件每次都相同,但是生成的key pair是不同的。

查看签名信息

利用下面命令查看设备中的ko文件信息:

hexdump -C spidev.ko | tail

下面是输出(内核签名后会把签名信息附在模块的最后面):

00004900  9e 94 0a 08 dd 24 a8 a4  7d 44 a6 63 bc 8a 94 7c  |.....$..}D.c...||
00004910  6d aa 74 28 3c 42 bb df  62 ec ad a6 e8 6e 65 4c  |m.t(<B..b....neL|
00004920  bd 79 79 3c 74 60 a3 e4  ef 0f 4d 02 29 fa dc 9a  |.yy<t`....M.)...|
00004930  06 b4 b2 1d 78 b9 c2 ff  11 1e c1 e0 4d e3 bb 45  |....x.......M..E|
00004940  02 f9 e6 43 b7 fc 46 9e  a6 98 fc a1 12 84 ce d8  |...C..F.........|
00004950  4c 32 d1 b8 ba 6b 4c 4d  3e 33 02 20 01 06 01 1e  |L2...kLM>3. ....|
00004960  14 00 00 00 00 00 02 02  7e 4d 6f 64 75 6c 65 20  |........~Module |
00004970  73 69 67 6e 61 74 75 72  65 20 61 70 70 65 6e 64  |signature append|
00004980  65 64 7e 0a                                       |ed~.|
00004984

由上面输出,我们发现这个ko已经有签名信息(Module signature appended),为何还是提示key不对。于是我将编译机中版本的spidev.ko和设备中的做比较,发现唯有最后部分不同,我猜一定是两个ko的签名不同,这应该就是初步原因。

仔细分析后,得到原因:
设备中的内核是后来编译的,编译完成后我将内核单独烧录进设备(内核肯定就放在kernel的分区),而未改变文件系统(这样会造成新kernel中的数字证书已经改变,但是文件系统中的ko未改变,而是用以前的内核中private key进行签名的)。重新完整烧录版本后,一切功能正常!

insmod安装内核module,提示Required key not available相关推荐

  1. android内核模块签名,android安装内核module,提示Required key not available

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样.这 ...

  2. android 安装内核module,提示Required key not available

    最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样.这 ...

  3. 【报错解决-Golang】go mod 安装第三方包提示:module declares its path as: ××× but was required as: ×××

    go mod 安装第三方包提示:module declares its path as: ××× but was required as: ××× 解决办法 今天使用 go mod tidy 和 go ...

  4. Python2.7安装ncmbot时提示:Microsoft Visual C++9.0 is required

    场景 Python 2.7 安装ncmbot时提示: Microsoft Visual C++9.0 is required 实现 访问: https://www.microsoft.com/zh-c ...

  5. 使用pip安装模块时提示: No module named pip

    使用pip安装模块时提示: No module named pip 今天使用pip安装模块提示错误信息: No module named pip windows 解决方法: >>> ...

  6. Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法

    Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法 问题描述 在Ubuntu上使用CP210x USB转UART设备时需要安装驱动程序(CP ...

  7. 使用python读取kafka实时topic数据demo,包括安装kafka module

    1. 安装kafka module kafka-python安装,转载:https://blog.csdn.net/see_you_see_me/article/details/78468421 1. ...

  8. 【驱动】ubuntu安装内核头文件

    1.检查是否已经安装 使用dpkg-query命令检查是否有可用的内核头文件. $ dpkg-query -s linux-headers-$(uname -r) 如果输出显示install ok i ...

  9. mysql安装1335_Mysql 安装问题。提示MySQL Server 5.1 -- Error 1335.

    这2天安装mysql 既然提示 Mysql server 5.1 -- Error 1335.The cabinet file 'product.cab' requi 提示信息如下 Product: ...

最新文章

  1. 搜狗上线海外权威健康搜索 支持中英双语一键切换
  2. 程序员如何对待自己的工作
  3. Groovy学习专栏
  4. centos6.5下升级gnutls
  5. 剑指Offer——二叉树的镜像
  6. linux 压缩文件小,技术|在 Linux 上压缩文件的 5 种方法
  7. 阿里妈妈技术团队 5 篇论文入选 TheWebConf 2022
  8. python 强制结束线程_在python中实现强制关闭线程的示例
  9. 2.3Python基础语法(三)之输入输出
  10. 常用转义符的使用 java 0133
  11. hhvm php5.6,PHP_5.5_/_PHP5.6_/_PHP-NG_和_HHVM_哪个性能更好?
  12. 3DShader之法线贴图(normal mapping)
  13. 悄悄告诉你Java面试必备技能是什么?
  14. 最新 IDEA 2022.1 版本即将发布,骚操作真不少...
  15. 遥感数字图像处理——第五章——辐射校正
  16. python函数变量教程_Python 函数变量
  17. 【机器学习】AI去马赛克工具(图像修复)
  18. navicat报错 Access violation at address in module ‘navicat.exe‘
  19. 小米MIX 2获取root超级权限的经验
  20. NLP系列(4)_朴素贝叶斯实战与进阶

热门文章

  1. 制作三星I9088 刷机ROM的实践(二)
  2. [免费小栗子插件] 公测插件 qq无手续费发卡机器人插件
  3. 研究生常用的一些学术搜索引擎
  4. windows“找不到msvcp120.dll ”或“msvcp120.dll 缺失
  5. 360小水滴用户测试
  6. 50款免费精美求职简历封面word模板
  7. 【吐血推荐一下】爆强的搞笑签名档
  8. R语言ineq算基尼系数_还在用Excel算区位基尼系数?用geo.gini吧!
  9. 二、3【FPGA】如何点亮LED灯
  10. msp430单片机点亮第一个灯