android 安装内核module,提示Required key not available
2015-10-21 15:38
686 查看
内核配置
内核如何签名
查看签名信息
问题根源
最近在调试一个驱动的时候,用insmod加载.ko的时候,提示Required key not available,第一反应是签名有问题,内核模块也开始使用类似apk的签名了吗?查资料后果然是这样。这个问题可以说不算是android的问题,而应该是linux系统的问题,android本身就是个linux系统。关于内核详细签名,具体见链接。
下来一步一步分析问题的所在。
内核配置项
CONFIG_MODULE_SIG=y
表示开启了签名机制,但是这时候模块签名或不签名都可以使用。
CONFIG_MODULE_SIG_FORCE=y
如果上述配置项使能,则模块必须有正确的签名才能正常使用。
CONFIG_MODULE_SIG_ALL=y
内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。
查看内核配置文件,发现上面3个配置项确实都打开了,因此肯定是ko签名的问题。
其中,x509.genkey是生成key pair时的配置项,signing_key.priv signing_key.x509分别为private key和数字证书。数字证书会打包进内核,里面有公钥等,用来解密嘛。每编译一次,虽然配置文件每次都相同,但是生成的key pair是不同的。
下面是输出(内核签名后会把签名信息附在模块的最后面),
由上面输出,我们发现这个ko已经有签名信息(Module signature appended),为何还是提示key不对。于是我将编译机中版本的my_ko.ko和设备中的做比较,发现唯有最后部分不同,我猜一定是两个ko的签名不同,这应该就是初步原因。
原来设备中的内核是后来编译的,编译完成后我将内核单独烧录进设备(内核肯定就放在kernel的分区),而未改变文件系统(这样会造成新kernel中的数字证书已经改变,但是文件系统中的my_ko.ko未改变,而是用以前的内核中private key进行签名的)。重新完整烧录版本后,一切功能正常!
内核如何签名
查看签名信息
问题根源
最近在调试一个驱动的时候,用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进行签名的)。重新完整烧录版本后,一切功能正常!
相关文章推荐
- startActivityForResult用法详解 requestCode resultCode
- easyui datagrid 没有记录
- iOS:分割控制器UISplitViewcontroller
- uGUI事件系统简述及使用方法总结
- Grunt 之 RequireJS
- pat1051Pop Sequence (25)
- rpmbuild
- UIPickerView与UIDatePicker
- 读《认知与设计:理解UI设计准则》第四章
- iOS uitableview 局部刷新
- 关于UIView的autoresizingMask属性的研究
- Android 界面—UI 开发控件
- StringBuffer和StringBuilder的区别
- Android UI 设计——TextView 控件
- Android UI 设计——Button 控件
- Android UI 设计——EditText 控件
- 上边的UITableViewCell覆盖下边的UITableViewCell的问题
- Android UI 设计——RadioButton 和 CheckBox 控件
- LR中select next row和update value on的设置
- Android UI 设计——ImageView 和 ImageButton 控件