在嵌入式Linux開發(fā)中,固件簽名是保障設備安全的關鍵環(huán)節(jié)——它能有效防止惡意固件篡改、非法刷入,從源頭筑牢設備的系統(tǒng)安全防線。最近在RK3588平臺(Linux6.1內核)上實操固件簽名時,踩了不少官方文檔的坑,經(jīng)過反復調試終于打通全流程。今天就把這份實戰(zhàn)經(jīng)驗整理成保姆級教程,從配置到問題排查,一步步帶大家搞定RK3588的固件簽名!
一、核心原理速覽
固件簽名的核心邏輯是通過非對稱加密(RSA2048)驗證固件完整性:
1.生成RSA密鑰對(私鑰用于簽名,公鑰用于驗簽);
2.給uboot、kernel打包生成的boot.img添加數(shù)字簽名;
3.設備啟動時,uboot通過內置的公鑰驗證boot.img簽名合法性,只有驗證通過才會加載kernel。
本次實操基于RK3588開發(fā)板+Linux6.1內核+uboot官方源碼,全程圍繞「配置-密鑰-簽名-驗證」四大環(huán)節(jié)展開。
二、前期準備
1.已編譯完成的uboot源碼(rk3588_defconfig配置);
2.已編譯生成的kernel鏡像(boot.img);
3.RK官方工具鏈(含rk_sign_tool);
4.OpenSSL工具(用于生成自簽名證書);
5.開發(fā)環(huán)境:Ubuntu 20.04 LTS(其他Linux發(fā)行版同理)。
三、分步實操指南
第一步:uboot配置開啟簽名功能
首先需要在uboot中啟用FIT鏡像簽名支持,修改配置文件:
1.進入uboot源碼根目錄,編輯配置文件:
vim u-boot/configs/rk3588_defconfig
2.在文件末尾添加以下兩行配置,開啟uboot和SPL的簽名功能:
CONFIG_FIT_SIGNATURE=yCONFIG_SPL_FIT_SIGNATURE=y
3.保存退出后,重新編譯uboot確保配置生效(若已編譯過,可直接執(zhí)行后續(xù)步驟,簽名時會自動應用配置)。
第二步:生成RSA密鑰對與自簽名證書
這一步是坑最多的地方!官方文檔的指令存在路徑和文件名錯誤,以下是驗證通過的正確流程:
1.創(chuàng)建密鑰存儲目錄
在uboot源碼根目錄下創(chuàng)建keys文件夾,用于存放密鑰和證書:
mkdir-pkeys
2.生成RSA2048密鑰對
使用RK官方工具rk_sign_tool生成私鑰(private_key.pem)和公鑰(public_key.pem),執(zhí)行命令:
../rkbin/tools/rk_sign_tool kk--bits2048--out.
?注意:rk_sign_tool的路徑需根據(jù)你的實際目錄調整(通常在rkbin/tools下);
?執(zhí)行成功后,會在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
?參數(shù)說明:
?-batch:自動填充信息,無需手動輸入;
?-new -x509:生成自簽名證書;
?-key:指定私鑰路徑;
?-out:輸出證書路徑。
5.驗證密鑰文件
執(zhí)行以下命令查看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.執(zhí)行簽名命令
在uboot源碼根目錄下執(zhí)行簽名指令,支持兩種模式:
模式1:僅簽名(不燒錄公鑰到OTP)
適合開發(fā)測試階段,無需修改設備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.重新打包固件
最后執(zhí)行sdk根目錄的打包腳本,生成最終可燒錄的完整固件:
./build.sh updateimg
打包完成后,會在輸出目錄生成包含簽名信息的完整固件(如update.img)。
四、常見問題排查(避坑指南)
問題1:創(chuàng)建軟鏈接時提示「文件已存在」
?原因:之前執(zhí)行過錯誤指令,殘留了無效鏈接;
?解決:刪除keys目錄下的殘留文件,重新創(chuàng)建鏈接:
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目錄下創(chuàng)建軟鏈接,且鏈接路徑為../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燒錄工具燒錄到開發(fā)板;
2.開機查看串口日志,若出現(xiàn)以下信息,說明簽名驗證通過:
conf:sha256,rsa2048:dev-ok.Verifysignature'key-dev'success
3.設備正常進入kernel啟動流程,最終進入系統(tǒng),說明固件簽名生效!

六、總結
RK3588的固件簽名核心是「配置-密鑰-簽名」三步走,關鍵避坑點在于:
1.正確配置uboot的簽名開關;
2.嚴格按照路徑和文件名生成密鑰與鏈接;
3.確保簽名后的boot.img被正確打包進固件。
通過固件簽名,我們能有效防止惡意篡改固件導致的安全風險,尤其適合量產階段的設備安全管控。如果在實操中遇到其他問題,歡迎在評論區(qū)留言交流~后續(xù)還會分享更多RK3588的實戰(zhàn)教程,記得點贊關注不迷路!
-
Linux
+關注
關注
88文章
11756瀏覽量
218997 -
RK3588
+關注
關注
8文章
555瀏覽量
7314
發(fā)布評論請先 登錄
瑞芯微RK3588開發(fā)板RK3588 EVB和RK3588S EVB解讀
RK3588 Android+Linux雙系統(tǒng)方案的實現(xiàn)
求一種基于RK3588實現(xiàn)SPI-NOR大容量存儲方案
如何實現(xiàn)基于RK3588的Android系統(tǒng)與Linux系統(tǒng)切換呢
TB-RK3588開發(fā)板debian11固件遠程登錄調試
基于RK3588芯片方案開發(fā)ARM PC項目
RK3588 SDK編譯與固件燒寫步驟
RK3588 Android 12.0 SDK編譯步驟分享
【飛凌RK3588開發(fā)板試用】源碼編譯
rk3588和rk3588s的區(qū)別
RK3588與3588s的區(qū)別
【技術分享】RK3588如何搭建xenomai3+ethercat
實戰(zhàn)復盤:RK3588 SPI+PCIe3x4方案啟動修復,從節(jié)點配置到驅動適配全解析
保姆級教程!RK3588 Linux6.1?固件簽名完整實現(xiàn)方案(不含rootfs)
評論