openharmony 给ko文件签名
前言
openharmony产品芯片厂商有时出于技术保护、法律合规等因素考虑,对有些驱动源码不开源,所以有时要将驱动源码编译成ko文件,启动时由系统控制加载。
加载ko方式
可以在init.cfg配置文件的 “cmds” 属性中配置 insmod命令+ko文件路径 加载方式

init进程加载ko后,会生成一些节点文件,通常在/dev下,由于这些文件是启动后生成的,配置的selinux安全上下文规则无法在开机时对其生效,所以要通过restorecon命令来恢复这些文件或目录的默认 SELinux 安全上下文

restorecon放在“post-fs-data”项的cmd中,因为“init”项的cmd命令优先于“post-fs-data”项执行。
安全上下文规则:system/etc/selinux/targeted/contexts/file_contexts
给ko文件签名
1、为什么给ko文件签名
通过init进程加载ko文件,并且开启了selinux开关,在启动时会出现avc告警:
# avc: denied { integrity } for pid=1 comm="init" lockdown_reason="unsigned module loading" scontext=u:r:init:s0 tcontext=u:r:init:s0 tclass=lockdown permissive=0
debug_only(`
allow init init:lockdown { integrity };
')
意思就是init进程在进行数据完整性操作时被封锁,原因是加载的模块没有签名,这个avc告警会阻止ko文件加载,导致无法正常进入系统。
2、给ko文件签名
查看内核defconfig模块签名相关配置
内核config配置: CONFIG_MODULE_SIG_SHA1=y //启用模块签名机制 CONFIG_MODULE_SIG_HASH="sha1" //指定使用的hash加密算法 CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
certs/signing_key.pem: 同时包含私钥和公钥证书, 内核的构建系统会在编译过程中自动生成。
hdc可通过命令查看:zcat proc/config.gz |grep CONFIG_SIG_* 查看内核config配置
将证书文件转换成公钥和私钥文件
签名命令需要私钥和公钥文件,需要将.pem证书文件转换为私钥公钥文件:
证书路径:out/wukong100/kernel/OBJ/linux-5.15/certs/signing_key.pem
bash # 1. 提取私钥(PEM格式) openssl pkey -in signing_key.pem -out private_key.pem # 2. 提取公钥证书(PEM格式) openssl x509 -in signing_key.pem -out cert.pem # 3. 转换为 DER 格式(如果需要) openssl x509 -in cert.pem -outform DER -out cert.der
使用 sign-file 工具对内核模块签名
sign-file: 内核构建时自动生成
路径:out/产品名/kernel/OBJ/linux-5.15/scripts/sign-file
ko签名命令:
bash # 使用私钥和公钥对 your_module.ko 进行签名,生成已签名的文件 your_module_signed.ko # sudo sign-file sha1 private_key.pem cert.pem your_module.ko your_module_signed.ko # 如果只想在原文件上直接签名,可以省略最后一个参数 # sudo sign-file sha1 private_key.pem cert.pem your_module.ko
查看签名是否成功
-
使用
modinfo命令: 查看模块信息,如果签名成功,输出中会包含sig_id,signer,signature等信息。bash modinfo your_module.ko

-
查看模块文件末尾: 签名会被附加在模块文件的末尾,可以通过
hexdump命令看到~Module signature appended~字样。bash hexdump -C your_module.ko | tail

3、其他
pem转换为 DER 格式(如果需要) openssl x509 -in cert.pem -outform DER -out cert.der
查看证书详情
openssl x509 -in cert.pem -text -noout | grep "Subject:"
自动化处理
增加action脚本处理:
outputs变量含义: root_out_dir=root_build_dir=out/产品名、target_out_dir=out/产品名/obj/action组件所在项目路径
更多推荐

所有评论(0)