Yocto构建中如何为最终部署的应用二进制文件签名并安装至rootfs?
问题解决方案
你的核心问题是签名时机不对——编译后生成的二进制文件会在后续的strip等优化步骤中被修改,导致签名与最终部署到rootfs的文件不匹配。要解决这个问题,需要调整签名任务的执行时机,并直接对安装目录下的最终二进制文件签名。
修改后的BitBake Recipe
SRC_URI = "file://hello.c" DEPENDS += "openssl-native" S = "${WORKDIR}" do_compile() { ${CC} hello.c ${LDFLAGS} -o hello } do_install() { install -d ${D}/opt/project install -m 0755 hello ${D}/opt/project/hello } # 调整签名任务顺序:在安装、strip完成后,打包前执行 addtask sign_application after do_install do_strip before do_package do_sign_application() { local target_bin="${D}/opt/project/hello" local target_sig="${target_bin}.sig" openssl dgst -sha256 -sign ${PATH_TO_PRIVATE_KEY}/${PRIVATE_KEY_NAME}.pem \ -passin file:${PATH_TO_PRIVATE_KEY_PWD_FILE}/${PRIVATE_KEY_PWD_FILE_NAME} \ -out ${target_sig} ${target_bin} chmod 0400 ${target_sig} } FILES:${PN} += "/opt/project/*"
关键修改说明
调整任务执行顺序
通过addtask sign_application after do_install do_strip before do_package,确保签名操作在二进制文件被安装到${D}目录、且完成strip优化后执行,同时在打包生成软件包前完成,保证签名文件能被纳入最终rootfs。直接签名最终部署文件
签名目标从编译目录${B}下的原始二进制,改为${D}/opt/project/hello——这是经过所有优化步骤后的最终版本,签名与部署文件完全匹配。简化签名文件处理
签名生成后直接写入${D}目录对应位置,并设置正确权限,后续打包流程会自动将其包含进rootfs,无需在do_install中手动复制。
额外注意事项
- 确保
PATH_TO_PRIVATE_KEY、PRIVATE_KEY_NAME等变量已在构建环境或recipe中正确定义,避免路径错误。 - 若你的构建流程包含其他自定义二进制修改任务,需将
sign_application放在这些任务之后执行。 - 可通过
bitbake -e <你的recipe名称>查看任务执行顺序,确认签名任务的位置是否符合预期。
内容的提问来源于stack exchange,提问作者shakta
相关产品推荐
相关产品推荐

