最近在调试一个驱动的时候,用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 my_ko.ko |tail

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

00538760  d3 48 70 32 1c 36 75 05  5f f2 39 84 7d c8 77 2f  |.Hp2.6u._.9.}.w/|
00538770  db 1d b6 1a 18 4b b5 0f  0f 44 5a f9 c3 1d d7 66  |.....K...DZ....f|
00538780  08 d5 22 ab 3e f6 4b 38  81 14 b3 a4 56 ab 22 3d  |..".>.K8....V."=|
00538790  55 fe cc 2b 9c 82 28 39  0e 47 df 63 a3 2a bc b4  |U..+..(9.G.c.*..|
005387a0  73 c9 a2 78 6a 6e 4c f7  4f 36 b3 45 1b 64 73 b8  |s..xjnL.O6.E.ds.|
005387b0  1d ca 49 ff 59 6a 99 4b  5b 13 40 75 01 06 01 1e  |..I.Yj.K[.@u....|
005387c0  14 00 00 00 00 00 02 02  7e 4d 6f 64 75 6c 65 20  |........~Module |
005387d0  73 69 67 6e 61 74 75 72  65 20 61 70 70 65 6e 64  |signature append|
005387e0  65 64 7e 0a                                       |ed~.|
005387e4

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

问题根源

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

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

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

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

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

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

  3. android安装apk时提示安装包异常导致安装失败,常见apk安装失败的错误及原因

    INSTALL_FAILED_NO_MATCHING_ABIS:主要是cpu架构不同导致需要的类库不同 INSTALL_FAILED_NO_MATCHING_ABIS is when you are ...

  4. 【报错解决-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 ...

  5. 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 ...

  6. Android Studio导入别人的module提示错误Plugin with id ‘com.jfrog.bintray‘ not found.

    1 问题 Android Studio导入别人的module提示错误如下 Plugin with id 'com.jfrog.bintray' not found. Plugin with id 'c ...

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

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

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

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

  9. Android Linux内核编译调试

    对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...

最新文章

  1. MYSQL5.7 忘记ROOT密码/初始化ROOT密码
  2. 学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)
  3. Intersection - POJ 1410(线段与矩形是否相交)
  4. 中国最险六大寺庙,最后一座至今无人登临
  5. 【BZOJ3218】a+b problem (最小割 + 主席树)
  6. Flowable 数据库表结构 ACT_RU_TASK
  7. jquery.prompt.js 弹窗的使用
  8. 什么?你还不知道IDEA Debug界面的按钮都是干啥用的?快进来补补课~
  9. python 面向对象编程、别人么样用_Python 中的面向对象没有意义
  10. 软件工程期末大作业——《软件工程》
  11. 开源项目halo个人博客源码学习初篇(一)
  12. python3.7下载 numpy
  13. 证件照排版软件_证件照的后期处理与打印
  14. HTML 内联元素之间的空隙问题
  15. Hardhat以太坊智能合约开发框架基础教程
  16. 高数 | 一点可导和邻域内可导能推出来什么?
  17. 计算机目标作文,人生的目标作文(精选5篇)
  18. CSV文件格式——方便好用个头最小的数据传递方式
  19. AndroidIOS APP启动速度专项测试方法
  20. Smart-doc的脚本生成在线文档(精简官方文档描述)

热门文章

  1. CreateFile系类异步、并行(同一个串口发送接收)
  2. 带栩字的优美古诗句_带栩字的名字_以栩字起名-尚名网
  3. tplink 2.4g弱信号剔除_科普 l 路由器信号2.4G和5G区别
  4. python查看图像通道数(通过PIL)
  5. es6-super关键字
  6. Android+微信 弹出层无法滚动?
  7. python 当前文件路径获取方式_python中获取文件路径的几种方式
  8. 好看高端的立体表白相册程序
  9. Java Excel合并工具 v1.0
  10. HTML5清爽博客自媒体网站模板