最近在调试一个驱动的时候,用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内核模块签名,android安装内核module,提示Required key not available相关推荐

  1. 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 debug 签名,Android debug签名和release签名

    Android debug签名和release签名 一:Android debug签名 在开发工具下使用debug模式下生成的APK,使用的是开发工具默认的debug签名文件 1.方式一: 通过bui ...

  4. Android手机,charles安装证书时提示“键入凭据存储的密码”问题

    charles_https charles版本:v4.1.4 解决方法: 检查是否设置了锁屏密码,需要设置锁屏密码,并重启手机.再次访问chls.pro/ssl下载安装证书. [已验证] 输入你的锁屏 ...

  5. android 微信签名,Android微信签名知识的总结

    前言 最近遇到一个项目的应用要上微信登录,大家都知道微信登录是需要开放平台上申请的,在微信开发平台创建移动应用后,需要填写: 需要填写的内容 问题 这里的应用签名是keystore的证书的md5,但是 ...

  6. android重签名,Android APP加固并重签名

    做app等保测评中测出APP需要加固并防止二次打包风险: 1.apk加固 免费加固平台(基础版3次):顶象~~~~https://console.dingxiang-inc.com 在任务列表中下载加 ...

  7. 【Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

    文章目录 一.安装内核模块 二.安装内核 三.重启系统 四.查看当前内核版本 一.安装内核模块 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 [Linux 内核]编译 Linux 内 ...

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

  9. android 5.0 apk 安装失败提示INSTALL_FAILED_INVALID_URI

    2015-02-12 14:09 在android 5.0 项目上开发的时候,进入U盘目录,通过pm 命令安装apk,发现安装失败,提示apk路径不对. 安装log信息如下: cd /mnt/usb/ ...

最新文章

  1. iOS-查询数据库--指定数据表中的当前数据行的总数量
  2. C# 调用Excel 出现服务器出现意外情况. (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)
  3. golang LMDB入门例子——尼玛,LMDB的文档真的是太少了
  4. Java 设计模式之适配器模式
  5. 失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌
  6. emc存储java打开后报错_连接EMC存储系统 - osc_mk8rqvg4的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 在IIS中启用父路径,不被黑客利用
  8. Django no such table: django_session错误解决办法
  9. Alain 菜单权限控制
  10. android 工作总结,Android项目的个人总结
  11. linux网络问题-子网掩码与网关不在同一段的处理
  12. ani转换ico文件
  13. 怎么卸载虚幻4_专访Epic Games:虚幻引擎5离手游近在咫尺,中小团队也能很快上手...
  14. 中考计算机易错知识点,【中考备考】易错知识点归类
  15. 2014下半年成长总结
  16. ping命令TTL的意思
  17. CSP 201609-3 炉石传说(C++)
  18. 计算机网络 (2)标准化工作、性能指标、分层结构
  19. 数据分析-淘宝卖家的数据分析
  20. 关于Chrome浏览器瀑布流

热门文章

  1. hdfs user 连接_通过API访问HDFS
  2. Python的__getattribute__ vs __getattr__的妙用
  3. linux怎么连续退回上次目录?cd - 只能在两个目录间来回切换(autojump)(pushd popd dirs)
  4. C语言中函数如何返回结构体?
  5. 如何绘制深度学习-目标检测评估指标P-R(precision-recall)曲线?如何计算AP(average-precision)?
  6. Tensorfow_yolov3 Intel Realsense D435 图像整合(合并)输入GPU计算耗时测试
  7. free 命令查看linux的内存使用情况
  8. vivadohlsdsp_Vivado HLS学习笔记
  9. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...
  10. 热泵精馏_精馏干货16 || 分子蒸馏