在嵌入式Linux开发中,固件签名是保障设备安全的关键环节——它能有效防止恶意固件篡改、非法刷入,从源头筑牢设备的系统安全防线。最近在RK3588平台(Linux6.1内核)上实操固件签名时,踩了不少官方文档的坑,经过反复调试终于打通全流程。今天就把这份实战经验整理成保姆级教程,从配置到问题排查,一步步带大家搞定RK3588的固件签名!
一、核心原理速览
固件签名的核心逻辑是通过非对称加密(RSA2048)验证固件完整性:
1.生成RSA密钥对(私钥用于签名,公钥用于验签);
2.给uboot、kernel打包生成的boot.img添加数字签名;
3.设备启动时,uboot通过内置的公钥验证boot.img签名合法性,只有验证通过才会加载kernel。
本次实操基于RK3588开发板+Linux6.1内核+uboot官方源码,全程围绕「配置-密钥-签名-验证」四大环节展开。
二、前期准备
1.已编译完成的uboot源码(rk3588_defconfig配置);
2.已编译生成的kernel镜像(boot.img);
3.RK官方工具链(含rk_sign_tool);
4.OpenSSL工具(用于生成自签名证书);
5.开发环境:Ubuntu 20.04 LTS(其他Linux发行版同理)。
三、分步实操指南
第一步:uboot配置开启签名功能
首先需要在uboot中启用FIT镜像签名支持,修改配置文件:
1.进入uboot源码根目录,编辑配置文件:
vim u-boot/configs/rk3588_defconfig
2.在文件末尾添加以下两行配置,开启uboot和SPL的签名功能:
CONFIG_FIT_SIGNATURE=yCONFIG_SPL_FIT_SIGNATURE=y
3.保存退出后,重新编译uboot确保配置生效(若已编译过,可直接执行后续步骤,签名时会自动应用配置)。
第二步:生成RSA密钥对与自签名证书
这一步是坑最多的地方!官方文档的指令存在路径和文件名错误,以下是验证通过的正确流程:
1.创建密钥存储目录
在uboot源码根目录下创建keys文件夹,用于存放密钥和证书:
mkdir-pkeys
2.生成RSA2048密钥对
使用RK官方工具rk_sign_tool生成私钥(private_key.pem)和公钥(public_key.pem),执行命令:
../rkbin/tools/rk_sign_tool kk--bits2048--out.
•注意:rk_sign_tool的路径需根据你的实际目录调整(通常在rkbin/tools下);
•执行成功后,会在uboot根目录生成private_key.pem(私钥)和public_key.pem(公钥)。
3.建立密钥软链接(关键步骤)
官方文档的链接指令会导致文件找不到,正确做法是进入keys目录建立软链接,确保签名工具能识别密钥:
cdkeysln-s ../public_key.pem dev.pubkey # 公钥链接ln-s ../private_key.pem dev.key # 私钥链接cd..
•为什么要做软链接?因为签名工具默认读取keys目录下名为dev.key(私钥)和dev.pubkey(公钥)的文件,直接链接避免修改工具配置。
4.生成自签名证书
使用OpenSSL生成x509格式自签名证书(本质等同于公钥,用于设备端验签):
openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
•参数说明:
○-batch:自动填充信息,无需手动输入;
○-new -x509:生成自签名证书;
○-key:指定私钥路径;
○-out:输出证书路径。
5.验证密钥文件
执行以下命令查看keys目录下的文件,确保3个文件都存在:
lskeys/
正确输出应为:dev.key(私钥链接)、dev.pubkey(公钥链接)、dev.crt(自签名证书)。
第三步:固件签名与打包
1.准备boot.img
将kernel编译生成的boot.img复制到uboot源码根目录(与keys文件夹同级):
cp/path/to/kernel/boot.img ./ # 替换为你的boot.img实际路径
2.执行签名命令
在uboot源码根目录下执行签名指令,支持两种模式:
模式1:仅签名(不烧录公钥到OTP)
适合开发测试阶段,无需修改设备OTP:
./make.shrk3588--spl-new--boot_imgboot.img
模式2:签名+烧录公钥哈希到OTP
./make.shrk3588--spl-new--boot_imgboot.img--burn-key-hash
适合量产阶段,公钥哈希写入OTP后,设备仅认可该密钥签名的固件:
3.验证签名结果
签名成功后,终端会输出以下提示,同时生成已签名的镜像文件:

********sign_tool ver1.42********privatekeyiskeys/dev.keypublickeyiskeys/dev.pubkeyloading key ok.Image(signed,version=0):uboot.img(FITwithuboot,trust...)isreadyImage(signed,version=0):boot.img(FITwithkernel,fdt,resource...)isreadyImage(signed):rk3588_spl_Loader_v1.18.113.bin(withspl, ddr...)isready
•已签名的boot.img会覆盖原文件,无需手动替换;
•若需保留原未签名镜像,建议先备份。
4.重新打包固件
最后执行sdk根目录的打包脚本,生成最终可烧录的完整固件:
./build.sh updateimg
打包完成后,会在输出目录生成包含签名信息的完整固件(如update.img)。
四、常见问题排查(避坑指南)
问题1:创建软链接时提示「文件已存在」
•原因:之前执行过错误指令,残留了无效链接;
•解决:删除keys目录下的残留文件,重新创建链接:
rm-rf keys/* # 清空keys目录cdkeysln-s ../public_key.pem dev.pubkeyln-s ../private_key.pem dev.keycd..
问题2:生成证书时提示「Can't open keys/dev.key for reading」
•原因:软链接路径错误,导致OpenSSL找不到私钥;
•解决:必须在keys目录下创建软链接,且链接路径为../private_key.pem(相对路径不能错)。
问题3:签名后启动停留在loader阶段,提示「Failed to verify required signature」
•原因:uboot未加载公钥,或签名时使用的私钥与验签公钥不匹配;
•解决:
a.确认uboot配置中已开启CONFIG_FIT_SIGNATURE=y;
b.重新生成密钥对和证书,确保签名时使用的是keys目录下的dev.key;
c.烧录已签名的boot.img(而非未签名的原文件)。
问题4:签名工具提示「load key failed」
•原因:密钥文件名错误(必须是dev.key和dev.pubkey);
•解决:检查keys目录下的文件命名,确保软链接名称正确。
五、验证签名有效性
1.将打包后的完整固件(update.img)通过RK烧录工具烧录到开发板;
2.开机查看串口日志,若出现以下信息,说明签名验证通过:
conf:sha256,rsa2048:dev-ok.Verifysignature'key-dev'success
3.设备正常进入kernel启动流程,最终进入系统,说明固件签名生效!

六、总结
RK3588的固件签名核心是「配置-密钥-签名」三步走,关键避坑点在于:
1.正确配置uboot的签名开关;
2.严格按照路径和文件名生成密钥与链接;
3.确保签名后的boot.img被正确打包进固件。
通过固件签名,我们能有效防止恶意篡改固件导致的安全风险,尤其适合量产阶段的设备安全管控。如果在实操中遇到其他问题,欢迎在评论区留言交流~后续还会分享更多RK3588的实战教程,记得点赞关注不迷路!
-
Linux
+关注
关注
88文章
11821浏览量
219592 -
RK3588
+关注
关注
8文章
592浏览量
7571
发布评论请先 登录
瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读
RK3588 Android+Linux双系统方案的实现
求一种基于RK3588实现SPI-NOR大容量存储方案
如何实现基于RK3588的Android系统与Linux系统切换呢
TB-RK3588开发板debian11固件远程登录调试
基于RK3588芯片方案开发ARM PC项目
RK3588 SDK编译与固件烧写步骤
【飞凌RK3588开发板试用】源码编译
rk3588和rk3588s的区别
RK3588与3588s的区别
【技术分享】RK3588如何搭建xenomai3+ethercat
实战复盘:RK3588 SPI+PCIe3x4方案启动修复,从节点配置到驱动适配全解析
技术分享 | RK3588如何搭建preempt_rt+ethercat
保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)
评论