如何使用外部工具对FIT镜像中的配置进行签名?
无本地私钥时FIT镜像配置段的签名方案
你提出的两个方案可行性分析
方案1:提取数据签名后回写.itb
可行,但需要配合U-Boot的dumpimage和设备树工具dtc操作,步骤如下:
- 先创建不含signature节点的ITS,执行
mkimage -f its_file its_image.itb生成未签名的FIT镜像。 - 用
dumpimage -l its_image.itb查看配置段的节点路径,再通过dumpimage提取需要签名的原始哈希数据(或直接从FDT结构导出待签名内容)。 - 将哈希数据传给外部签名工具,获取匹配算法格式的签名(比如ecdsa256对应的DER格式)。
- 用
fdt set命令把签名写入.itb的signature节点的value属性:fdt set its_image.itb /configurations/kernel_dtb/signature value "<十六进制编码的签名>" - 最后执行
fdt resize确保镜像大小足够,完成签名注入。
方案2:构建前预生成签名并直接指定
完全可行,U-Boot的mkimage支持在ITS中直接指定签名值,无需本地私钥。只需修改ITS的signature节点,添加value属性填入外部生成的签名(十六进制格式):
default = "kernel_dtb"; kernel_dtb { description = "Linux kernel and FDT blob"; kernel = "kernel"; fdt = "base_fdt"; signature { algo = "sha256,ecdsa256"; key-name-hint = "sign-key"; sign-images = "kernel", "fdt"; value = "<外部生成的十六进制签名>"; }; }; };
生成镜像时mkimage会直接使用该签名,不会尝试用私钥重新生成。你可以在Buildroot构建流程中加自定义步骤:先对kernel、dtb等文件计算哈希,传给外部工具拿签名,再把签名动态填入ITS模板,最后调用mkimage生成带签名的FIT镜像。
其他替代方案
自定义Buildroot脚本集成外部签名
在Buildroot的package/boot/uboot目录加自定义补丁,或在项目local.mk中添加钩子,在生成ITS前自动执行:
- 导出Buildroot编译出的kernel、dtb文件路径。
- 按ITS指定的算法(如
sha256sum)计算文件哈希。 - 调用外部签名工具,传入哈希值获取签名。
- 将签名写入ITS模板对应位置。
- 调用mkimage生成最终的签名FIT镜像。
适配U-Boot的fit_sign.sh脚本
U-Boot源码中的tools/fit_sign.sh原本用于本地私钥签名,可修改脚本将本地签名逻辑替换为调用外部签名工具的接口,让脚本自动完成哈希计算、外部签名获取、签名注入的全流程,再在Buildroot中配置使用修改后的脚本生成签名镜像。
内容的提问来源于stack exchange,提问作者Tyrreus
相关产品推荐
相关产品推荐

