保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)

电子说

1.4w人已加入

描述

 

 

 

在嵌入式Linux开发中,固件签名是保障设备安全的关键环节——它能有效防止恶意固件篡改、非法刷入,从源头筑牢设备的系统安全防线。最近在RK3588平台(Linux6.1内核)上实操固件签名时,踩了不少官方文档的坑,经过反复调试终于打通全流程。今天就把这份实战经验整理成保姆级教程,从配置到问题排查,一步步带大家搞定RK3588的固件签名!

一、核心原理速览

 

 

固件签名的核心逻辑是通过非对称加密(RSA2048)验证固件完整性:

 

 

1.生成RSA密钥对(私钥用于签名,公钥用于验签);

 

 

2.ubootkernel打包生成的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.在文件末尾添加以下两行配置,开启ubootSPL的签名功能:

 

 

  •  
  •  
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. 验证签名结果

 

 

签名成功后,终端会输出以下提示,同时生成已签名的镜像文件:

Linux

 

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
********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.keydev.pubkey);

 

 

解决:检查keys目录下的文件命名,确保软链接名称正确。

 

 

五、验证签名有效性

 

 

1.将打包后的完整固件(update.img)通过RK烧录工具烧录到开发板;

 

 

2.开机查看串口日志,若出现以下信息,说明签名验证通过:

 

 

  •  
  •  
conf:sha256,rsa2048:dev-ok.Verify signature 'key-dev' success

3.设备正常进入kernel启动流程,最终进入系统,说明固件签名生效!

Linux

 

 

 

六、总结

 

 

RK3588的固件签名核心是「配置-密钥-签名」三步走,关键避坑点在于:

 

 

1.正确配置uboot的签名开关;

 

 

2.严格按照路径和文件名生成密钥与链接;

 

 

3.确保签名后的boot.img被正确打包进固件。

 

 

通过固件签名,我们能有效防止恶意篡改固件导致的安全风险,尤其适合量产阶段的设备安全管控。如果在实操中遇到其他问题,欢迎在评论区留言交流~后续还会分享更多RK3588的实战教程,记得点赞关注不迷路!

审核编辑 黄宇
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分