博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核如何签名
阅读量:5965 次
发布时间:2019-06-19

本文共 3118 字,大约阅读时间需要 10 分钟。

转自:http://blog.csdn.net/hui872370036/article/details/69950869

 

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

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

内核配置

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

内核配置项

CONFIG_MODULE_SIG=y
  • 1
  • 1

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

CONFIG_MODULE_SIG_FORCE=y
  • 1
  • 1

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

CONFIG_MODULE_SIG_ALL=y
  • 1
  • 1

内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。 

查看内核配置文件,发现上面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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

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

查看签名信息

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

hexdump -C spidev.ko | tail
  • 1
  • 1

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

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(
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

仔细分析后,得到原因: 

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

转载于:https://www.cnblogs.com/x_wukong/p/7451877.html

你可能感兴趣的文章
创建可用实验快照(二)
查看>>
开源社交系统ThinkSNS——社交与电商的结合
查看>>
MySQL双主(master-master)补充
查看>>
ldap添加自定义字段
查看>>
Vertically aligning HTML
查看>>
Linux之cut命令
查看>>
jedis 用连接池时超时返回值类型错误
查看>>
nginx 查看每秒有多少访问量
查看>>
python正则表达式
查看>>
安装nagios中php安装报错 configure error xml2-config not foud
查看>>
php邮件发送类
查看>>
Python算法题----在列表中找到和为s的两个数字
查看>>
Gson解析Json
查看>>
Spring Cloud with Turbine
查看>>
关于Java浮点数运算精度丢失问题
查看>>
各种主流 SQLServer 迁移到 MySQL 工具对比
查看>>
路由访问控制列表的设计
查看>>
使用firefox44版本,弃用chrome
查看>>
《深入理解Java虚拟机》(二)java虚拟机运行时数据区
查看>>
MySQL for Java的SQL注入测试
查看>>