保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs) 电子说
在嵌入式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 -p keys
2. 生成RSA2048密钥对
使用RK官方工具rk_sign_tool生成私钥(private_key.pem)和公钥(public_key.pem),执行命令:
../rkbin/tools/rk_sign_tool kk --bits 2048 --out .
•注意:rk_sign_tool的路径需根据你的实际目录调整(通常在rkbin/tools下);
•执行成功后,会在uboot根目录生成private_key.pem(私钥)和public_key.pem(公钥)。
3. 建立密钥软链接(关键步骤)
官方文档的链接指令会导致文件找不到,正确做法是进入keys目录建立软链接,确保签名工具能识别密钥:
cd keysln -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个文件都存在:
ls keys/
正确输出应为: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.sh rk3588 --spl-new --boot_img boot.img
模式2:签名+烧录公钥哈希到OTP
./make.sh rk3588 --spl-new --boot_img boot.img --burn-key-hash
适合量产阶段,公钥哈希写入OTP后,设备仅认可该密钥签名的固件:
3. 验证签名结果
签名成功后,终端会输出以下提示,同时生成已签名的镜像文件:

********sign_tool ver1.42********private key is keys/dev.keypublic key is keys/dev.pubkeyloading key ok.Image(signed,version=0):uboot.img(FIT with uboot,trust...)is readyImage(signed,version=0):boot.img(FIT with kernel,fdt,resource...)is readyImage(signed):rk3588_spl_Loader_v1.18.113.bin(with spl, ddr...) is ready
•已签名的boot.img会覆盖原文件,无需手动替换;
•若需保留原未签名镜像,建议先备份。
4. 重新打包固件
最后执行sdk根目录的打包脚本,生成最终可烧录的完整固件:
./build.sh updateimg
打包完成后,会在输出目录生成包含签名信息的完整固件(如update.img)。
四、常见问题排查(避坑指南)
问题1:创建软链接时提示「文件已存在」
•原因:之前执行过错误指令,残留了无效链接;
•解决:删除keys目录下的残留文件,重新创建链接:
rm -rf keys/* # 清空keys目录cd keysln -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.Verify signature 'key-dev' success
3.设备正常进入kernel启动流程,最终进入系统,说明固件签名生效!

六、总结
RK3588的固件签名核心是「配置-密钥-签名」三步走,关键避坑点在于:
1.正确配置uboot的签名开关;
2.严格按照路径和文件名生成密钥与链接;
3.确保签名后的boot.img被正确打包进固件。
通过固件签名,我们能有效防止恶意篡改固件导致的安全风险,尤其适合量产阶段的设备安全管控。如果在实操中遇到其他问题,欢迎在评论区留言交流~后续还会分享更多RK3588的实战教程,记得点赞关注不迷路!
全部0条评论
快来发表一下你的评论吧 !