概述
J6X系统在release编译时支持内核模块签名验证,仅加载使用正确密钥进行数字签名的内核模块。禁止加载未签名的内核模块或使用错误密钥签名的内核模块,客户需要替换成自己的key进行签名。
模块签名启用后,Linux内核将仅加载使用正确密钥进行数字签名的内核模块。禁止加载未签名的内核模块或使用错误密钥签名的内核模块来进一步强化系统安全。
关于内核模块签名的介绍请看下文:
关于内核模块签名的介绍请看下文:
配置
内核配置选项
在menuconfig中选中CONFIGMODULESIG,对应生成的config就被默认选中相关配置来支持模块签名。

配置说明
+----------------------------+----------------------------------------------+
| 项目 | 描述 |
+==========================+============================================+
| CONFIGMODULESIGFORCE | 对于严格的方法,必须存在有效的签名 |
+----------------------------+----------------------------------------------+
| CONFIGMODULESIGALL | 内核模块不自动签名,该选项自动签名所有模块 |
+----------------------------+----------------------------------------------+
| 项目 | 描述 |
+==========================+============================================+
| CONFIGMODULESIGFORCE | 对于严格的方法,必须存在有效的签名 |
+----------------------------+----------------------------------------------+
| CONFIGMODULESIGALL | 内核模块不自动签名,该选项自动签名所有模块 |
+----------------------------+----------------------------------------------+
用于签名的\ 哈希算法\ :SHA-512
.. code:: text
CONFIG_MODULE_SIG_SHA512
CONFIG_MODULE_SIG_HASH="sha512"
密钥签名
执行签名可执行程序,使用密钥对内核模块进行签名。
Make ModuleInstall签名
将内核配置为对模块进行签名,则此签名将在内核编译make modulesinstall时进行签名了。
手动对ko签名
指定需要的证书(包括公钥)和私钥、哈希算法以及内核模块。
通过sign-file(可执行程序)使用密钥对要安装到内核的模块进行签名,命令格式如下:
+-------------------------------------------------------------------+
| sign-file sha512 module_signature.pem module_signature.x509 xx.ko |
| |
+-------------------------------------------------------------------+
| sign-file sha512 module_signature.pem module_signature.x509 xx.ko |
| |
+-------------------------------------------------------------------+
手动ko签名实例
SDK整编时有封装好的脚本可以用来自动签名,对于不用modulesinstall进行安装的模块,可以用如下脚本:
+-------------------------------------+
| sign_ko.sh xxx.ko # 传入驱动 |
| |
| sign_ko.sh dir # 传入驱动所在目录 |
| |
+-------------------------------------+
| sign_ko.sh xxx.ko # 传入驱动 |
| |
| sign_ko.sh dir # 传入驱动所在目录 |
| |
+-------------------------------------+
只用AppSDK时,需要直接使用下面的命令
+-------------------------------------------------------------------------+
| ./sign-file sha512 module_signature.pem module_signature.x509 xx.ko |
| |
+-------------------------------------------------------------------------+
| ./sign-file sha512 module_signature.pem module_signature.x509 xx.ko |
| |
+-------------------------------------------------------------------------+
发布版本中的签名
发布版本中会把签名密钥文件放在AppSDK中,给发布版本提供ko的时候可以直接用这些签名文件:
ls AppSDK/module_sig/
module_signature.pem module_signature.x509 sign-file
ls AppSDK/module_sig/
module_signature.pem module_signature.x509 sign-file
发布包里面也有AppSDK目录。
密钥
证书 (含公钥)\ :modulesignature.x509
私钥\ :modulesignature.pem
定制修改签名机制
要替换固定key,将新的key替换源码目录中的build_tools/hobot_tools/keys/下的私钥和证书即可,如下:
build_tools/hobot_tools/keys$ ls module_signature.*
module_signature.pem module_signature.x509
build_tools/hobot_tools/keys$ ls module_signature.*
module_signature.pem module_signature.x509
可以通过openssl创建自己的密钥对。
openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform PEM -out module_signature.pem -keyout module_signature.pem
${OUTPUT_BUILD_DIR}/kernel/certs/extract-cert module_signature.pem module_signature.x509 # 生成证书
openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform PEM -out module_signature.pem -keyout module_signature.pem
${OUTPUT_BUILD_DIR}/kernel/certs/extract-cert module_signature.pem module_signature.x509 # 生成证书
其中x509.genkey可以用linux下certs/default_x509.genkey;extract-cert工具是在支持模块签名编译中生成的。
#. 当key替换或者修改签名机制的时候,需要对工程目录进行清理:
删除生成目录中的内容,rm out/ -rf。
#. 清理完成后,重新编译系统去烧录验证。
#. 通过strip命令去去除内核模块的签名。
+-------------------------------------------------------+
| aarch64-linux-gnu-strip -g ~/nfs/modulesigtest.ko |
+-------------------------------------------------------+
| aarch64-linux-gnu-strip -g ~/nfs/modulesigtest.ko |
+-------------------------------------------------------+
签名结果确认
1.dmesg grep -i x.509
使用新配置的内核重新启动。在dmesg的输出中,您应该能够确认加载了正确的证书:
root@hobot:~# dmesg | grep -i x.*509
[ 0.333727] Asymmetric key parser 'x509' registered
[ 2.068923] Loading compiled-in X.509 certificates
[ 2.152800] Loaded X.509 cert 'Build time autogenerated kernel key: 4e24f188419c7e1d5305f1d0ae2339286e1835c2'
[ 39.117796] [I|MIPI|hobot_mipi_csi_stl.c+252]:[RX4][STL]: module 509 reg done
root@hobot:~# dmesg | grep -i x.*509
[ 0.333727] Asymmetric key parser 'x509' registered
[ 2.068923] Loading compiled-in X.509 certificates
[ 2.152800] Loaded X.509 cert 'Build time autogenerated kernel key: 4e24f188419c7e1d5305f1d0ae2339286e1835c2'
[ 39.117796] [I|MIPI|hobot_mipi_csi_stl.c+252]:[RX4][STL]: module 509 reg done
2.cat /proc/keys
如果启用了CONFIGKEYSDEBUGPROCKEYS,那么 root
用户可以在/proc/keys文件中查看证书:
root@hobot:~# cat /proc/keys
...
0c5ec4d5 I------ 1 perm 1f030000 0 0 asymmetri Build time autogenerated kernel key: 4e24f188419c7e1d5305f1d0ae2339286e1835c2: X509.rsa 6e1835c2 []
用户可以在/proc/keys文件中查看证书:
root@hobot:~# cat /proc/keys
...
0c5ec4d5 I------ 1 perm 1f030000 0 0 asymmetri Build time autogenerated kernel key: 4e24f188419c7e1d5305f1d0ae2339286e1835c2: X509.rsa 6e1835c2 []
3.hexdump -C hobot-pcie.ko tail
内核模块在末尾附加了数字签名。一个简单的hexdump可以确认签名是否存在。
在ko文件的末尾有module signature appended的字样代表签名成功。