MTK SecureBoot全链路配置指南

根据您的要求,我为您整理了一份可直接发布到博客平台的MTK平台SecureBoot完整配置指南。这份指南整合了基础配置、日常自动化构建和最终部署的全流程,并已优化为适合技术博客的阅读和发布格式。


MTK平台SecureBoot完整配置与自动化打包发布指南

引言

在嵌入式设备,特别是Android设备上,启用SecureBoot(安全启动)是保护设备固件完整性、防止未经授权的固件被加载的关键安全机制。MTK平台通过Efuse(电子保险丝) 来存储根密钥,实现硬件级的安全启动验证。本文将详细记录在MTK平台(以MT6761为例)上,从零开始配置、编译、签名、打包并最终烧录启用SecureBoot的完整流程。内容涵盖一次性配置步骤日常自动化构建脚本 以及最终的烧录验证,旨在为开发者提供一份清晰、可操作的技术手册。

第一部分:基础环境与一次性配置

1. 环境说明

本文档基于以下环境,其他平台或项目需相应调整路径和配置。

项目 说明
平台 (Platform) MT6761
项目 (Project) xqt551
Android 版本 Android 12

2. 内核与引导加载程序配置

首先,需要在不同层级的配置文件中启用SecureBoot相关支持。

makefile 复制代码
# 1. 配置 Preloader
# 文件路径: vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/xqt551/xqt551.mk
MTK_SECURITY_SW_SUPPORT=yes
MTK_SEC_BOOT=ATTR_SBOOT_ONLY_ENABLE_ON_SCHIP
MTK_SEC_USBDL=ATTR_SUSBDL_ONLY_ENABLE_ON_SCHIP

# 2. 配置 LK (Little Kernel)
# 文件路径: vendor/mediatek/proprietary/bootable/bootloader/lk/project/xqt551.mk
MTK_SECURITY_SW_SUPPORT=yes

# 3. 配置 Kernel (调试版与正式版)
# 文件路径: kernel/arch/arm/configs/xqt551_debug_defconfig
CONFIG_MTK_SECURITY_SW_SUPPORT=y
# 文件路径: kernel/arch/arm/configs/xqt551_defconfig
CONFIG_MTK_SECURITY_SW_SUPPORT=y

注意 :64位系统需将 arm 改为 arm64,其他项目需将 xqt551 替换为对应项目名 。

3. 生成并部署密钥(最关键的一步)

SecureBoot依赖于非对称加密。我们需要生成三组RSA密钥对,并将公钥集成到代码中。

创建一个名为 generate_keys.sh 的脚本并执行 :

bash 复制代码
#!/bin/bash
# generate_keys.sh - 生成SecureBoot所需的根密钥、镜像签名密钥和DA签名密钥

echo "1. 生成根密钥对 (Root Key Pair)"
cd vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor

# 1.1 生成根私钥
openssl genrsa -out root_prvk.pem 2048
python pem_to_der.py root_prvk.pem root_prvk.der

# 1.2 从私钥导出根公钥
openssl rsa -in root_prvk.pem -pubout > root_pubk.pem
python pem_to_der.py root_pubk.pem root_pubk.der

echo "2. 生成镜像签名密钥对 (Image Signing Key Pair)"
openssl genrsa -out img_prvk.pem 2048
python pem_to_der.py img_prvk.pem img_prvk.der
openssl rsa -in img_prvk.pem -pubout > img_pubk.pem
python pem_to_der.py img_pubk.pem img_pubk.der

echo "3. 生成DA签名密钥对 (DA Signing Key Pair)"
openssl genrsa -out da_prvk.pem 2048
python pem_to_der.py da_prvk.pem da_prvk.der
openssl rsa -in da_prvk.pem -pubout > da_pubk.pem
python pem_to_der.py da_pubk.pem da_pubk.der

# 4. 生成并部署公钥头文件
chmod 777 der_extractor
./der_extractor root_pubk.der oemkey.h ANDROID_SBC
cp -r oemkey.h ../../../bootable/bootloader/preloader/custom/xqt551/inc/
cp -r oemkey.h ../../../bootable/bootloader/lk/target/xqt551/inc/

./der_extractor da_pubk.der dakey.h ANDROID_SBC
sed -i "s/OEM/DA/g" dakey.h
cp -r dakey.h ../../../bootable/bootloader/preloader/custom/xqt551/inc/

echo "密钥生成完成!请务必备份所有.pem和.der文件!"

执行脚本后,将生成以下密钥文件,其作用如下表所示 :

密钥组 生成的文件 作用与安全等级
根密钥 (Root Keys) root_prvk.pem, root_prvk.der, root_pubk.pem, root_pubk.der, oemkey.h 最高机密 。公钥(oemkey.h)将被烧录到Efuse中,一旦烧录不可更改。私钥必须离线严格保管。
镜像签名密钥 (Img Keys) img_prvk.pem, img_prvk.der, img_pubk.pem, img_pubk.der 用于对系统镜像(如boot、recovery)进行签名。私钥由开发方保管。
DA签名密钥 (DA Keys) da_prvk.pem, da_prvk.der, da_pubk.pem, da_pubk.der, dakey.h 用于对Download Agent(DA)文件进行签名。

⚠️ 重要警告 :此脚本在烧录Efuse后绝对不能再次执行 ,否则会生成新密钥,导致与已烧录的公钥不匹配,设备永久变砖。所有生成的 .pem.der 文件必须进行安全备份 。

4. 生成并签名Download Agent (DA) 文件

DA文件是MTK平台下载工具与设备通信的桥梁,启用SecureBoot后必须使用签名的DA。

  1. 准备工具 :获取 FLASHLIB_DA_EXE(Official)_ALPS 工具包,并安装配套的GCC和GnuWin32 。
  2. 配置环境 :修改工具包内 base.mk 中的 GCCDIR 路径,指向你的GCC工具链。
  3. 替换公钥 :将上一步生成的 oemkey.h 文件,覆盖到工具包的 custom/MT6761/ 目录下。
  4. 编译未签名DA :在工具包的 buildspec 目录下执行 make BBCHIP=MT6761,生成 MTK_AllInOne_DA.bin
  5. 签名DA文件 :将生成的 MTK_AllInOne_DA.bin 复制到源码的 vendor/mediatek/proprietary/scripts/secure_chip_tools/prebuilt/resignda/ 路径下,等待后续统一签名 。

第二部分:自动化构建与签名脚本

为了提升日常开发效率,避免重复操作,我们可以将编译、签名和打包流程脚本化。

脚本1:镜像签名脚本 (sign_image.sh)

此脚本负责在系统编译完成后,对生成的镜像进行批量签名。

bash 复制代码
#!/bin/bash
# sign_image.sh - 对编译产出的镜像进行签名

echo "========================================"
echo "开始执行镜像签名流程..."
echo "========================================"

# 1. 复制密钥到指定目录 
cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/img_prvk.pem \
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/xqt551/security/chip_config/s/key

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/root_prvk.pem \
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/xqt551/security/chip_config/s/key

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/da_prvk.pem \
vendor/mediatek/proprietary/scripts/secure_chip_tools/keys/resignda

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/da_prvk.pem \
vendor/mediatek/proprietary/scripts/secure_chip_tools/keys/resignda/epp_prvk.pem

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/da_prvk.pem \
vendor/mediatek/proprietary/scripts/secure_chip_tools/keys/toolauth

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/da_prvk.pem \
vendor/mediatek/proprietary/scripts/secure_chip_tools/keys/toolauth/epp_prvk.pem

cp -r vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/root_prvk.pem \
vendor/mediatek/proprietary/scripts/secure_chip_tools/keys/toolauth

# 2. 部署证书密钥 
python ./vendor/mediatek/proprietary/scripts/sign-image_v2/img_key_deploy.py mt6761 xqt551 \
cert1_key_path=./vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/root_prvk.pem \
cert2_key_path=./vendor/mediatek/proprietary/scripts/sign-image_v2/der_extractor/img_prvk.pem \
root_key_padding=pss 2>&1 | tee SecureGen.log

# 3. 清理并编译preloader 
make clean-preloader
./build.sh xqt551 1 1 1 1 64 # 请替换为您项目的编译命令

# 4. 签名DA文件和生成授权文件 
cd vendor/mediatek/proprietary/scripts/secure_chip_tools/
python resign_da.py prebuilt/resignda/MTK_AllInOne_DA.bin MT6761 settings/resignda/bbchips_pss.ini all \
out/resignda/MTK_AllInOne_DA-resing.bin

python toolauth.py -i settings/toolauth/toolauth_key.ini -g settings/toolauth/toolauth_gfh_config_pss.ini \
out/toolauth/auth_sv5.auth
cd -

# 5. 签名所有系统镜像 
export MTK_PLATFORM_DIR=mt6761 # 请替换为您的平台
export MTK_BASE_PROJECT=xqt551 # 请替换为您的项目
export PYTHONDONTWRITEBYTECODE=True
export PRODUCT_OUT=$(get_build_var PRODUCT_OUT) # 获取镜像输出路径
export BOARD_AVB_ENABLE=true

python ./vendor/mediatek/proprietary/scripts/sign-image_v2/sign_flow.py \
-env_cfg ./vendor/mediatek/proprietary/scripts/sign-image_v2/env.cfg "$MTK_PLATFORM_DIR" "$MTK_BASE_PROJECT"

echo "========================================"
echo "镜像签名流程完成!"
echo "签名后的镜像位于: $PRODUCT_OUT"
echo "签名后的DA文件位于: vendor/mediatek/proprietary/scripts/secure_chip_tools/out/resignda/"
echo "授权文件位于: vendor/mediatek/proprietary/scripts/secure_chip_tools/out/toolauth/"
echo "========================================"

脚本2:一键编译打包发布脚本 (build_with_secure_boot.sh)

此脚本整合了从源码编译到打包发布的全流程,是实现持续集成的关键。

bash 复制代码
#!/bin/bash
# build_with_secure_boot.sh - 一键编译、签名并打包SecureBoot固件

CLEAN_BUILD=false
if [ "$1" == "clean" ]; then
  CLEAN_BUILD=true
  echo "即将执行清理后全量编译..."
fi

# 定义变量
PROJECT="xqt551" # 修改为您的项目名
PLATFORM="mt6761" # 修改为您的平台
CURRENT_TIME=$(date "+%Y%m%d_%H%M%S")
RELEASE_DIR="release_${PROJECT}_secureboot_${CURRENT_TIME}"

echo "========================================"
echo "开始SecureBoot固件一键构建流程"
echo "项目: $PROJECT, 平台: $PLATFORM"
echo "========================================"

# 步骤1: 初始化构建环境
source build/envsetup.sh
lunch full_${PROJECT}-userdebug

# 步骤2: 执行编译
if [ "$CLEAN_BUILD" = true ]; then
  make clean
  echo "清理完成,开始全量编译..."
fi

echo "开始编译系统..."
make -j$(nproc) 2>&1 | tee build_log_${CURRENT_TIME}.txt
if [ ${PIPESTATUS[0]} -ne 0 ]; then
  echo "编译失败,请检查日志: build_log_${CURRENT_TIME}.txt"
  exit 1
fi
echo "系统编译成功!"

# 步骤3: 执行镜像签名
echo "开始执行镜像签名..."
./sign_image.sh 2>&1 | tee sign_log_${CURRENT_TIME}.txt
if [ ${PIPESTATUS[0]} -ne 0 ]; then
  echo "镜像签名失败,请检查日志: sign_log_${CURRENT_TIME}.txt"
  exit 1
fi
echo "镜像签名成功!"

# 步骤4: 创建发布目录并收集文件
echo "创建发布包..."
mkdir -p ${RELEASE_DIR}/images
mkdir -p ${RELEASE_DIR}/tools

# 收集已签名的核心镜像
cp $PRODUCT_OUT/preloader_${PROJECT}.bin ${RELEASE_DIR}/images/
cp $PRODUCT_OUT/lk.bin ${RELEASE_DIR}/images/
cp $PRODUCT_OUT/boot.img ${RELEASE_DIR}/images/
cp $PRODUCT_OUT/recovery.img ${RELEASE_DIR}/images/
cp $PRODUCT_OUT/vbmeta.img ${RELEASE_DIR}/images/
cp $PRODUCT_OUT/system.img ${RELEASE_DIR}/images/ # 根据实际情况添加其他分区

# 收集签名后的DA和授权文件
cp vendor/mediatek/proprietary/scripts/secure_chip_tools/out/resignda/MTK_AllInOne_DA-resing.bin ${RELEASE_DIR}/tools/
cp vendor/mediatek/proprietary/scripts/secure_chip_tools/out/toolauth/auth_sv5.auth ${RELEASE_DIR}/tools/

# 步骤5: 生成发布说明文档
cat > ${RELEASE_DIR}/README_FLASH.md << EOF
# SecureBoot 固件发布包说明
- **生成时间**: ${CURRENT_TIME}
- **项目**: ${PROJECT}
- **平台**: ${PLATFORM}

## 文件清单
### images/ 目录 (烧录用镜像)
- preloader_${PROJECT}.bin: 签名后的预加载器
- lk.bin: 签名后的Little Kernel
- boot.img: 签名后的内核镜像
- recovery.img: 签名后的恢复镜像
- vbmeta.img: 签名后的AVB元数据镜像
- system.img: 系统镜像

### tools/ 目录 (烧录工具文件)
- MTK_AllInOne_DA-resing.bin: **已签名的Download Agent文件,烧录时必须使用此文件**
- auth_sv5.auth: 授权文件

## 烧录步骤 (使用 SP Flash Tool)
1.  打开SP Flash Tool,选择 **Download Agent** 为 \`tools/MTK_AllInOne_DA-resing.bin\`。
2.  加载 **Scatter File**。
3.  在 \`images/\` 目录中选择对应的签名镜像文件。
4.  **(关键)** 在工具中启用Efuse选项,并加载正确的 \`efuse_${PLATFORM}.xml\` 配置文件。
5.  连接设备并开始下载。

**警告**: 烧录Efuse是永久性操作,请务必确认配置正确。
EOF

echo "========================================"
echo "固件构建与打包完成!"
echo "发布包已生成至: $(pwd)/${RELEASE_DIR}"
echo "请查阅其中的 README_FLASH.md 获取烧录说明。"
echo "========================================"

第三部分:烧录Efuse与最终验证

1. 烧录前准备

  1. 获取工具 :使用 SP_MDT 工具进行烧录。
  2. 准备文件 :将签名后的所有镜像文件、已签名的 MTK_AllInOne_DA-resing.binauth_sv5.auth 以及 efuse_MT6761.xml 配置文件放在同一目录。
  3. 修改Efuse配置
    • 打开 SP_MDT 工具目录下的 Efuse.ini,设置 Enable = 1,并指定 EfuseXmlPath 为你的 efuse_MT6761.xml 文件路径 。
    • 编辑 efuse_MT6761.xml,确保其中的 pub-key-n 字段值与之前生成的 oemkey.h 文件中的公钥数据完全一致 。

2. 烧录流程

  1. 扫描设备 :在SP Flash Tool中选择 BootRom+PreLoader 模式,点击扫描,然后给设备断电再上电,等待工具识别设备 。
  2. 烧写Efuse :点击 Write Efuse 按钮。此操作不可逆,请再三确认公钥配置正确
  3. 下载固件 :Efuse烧写成功后,勾选所有需要下载的已签名镜像分区,点击 Download 按钮,将固件烧录到设备中 。

3. 验证SecureBoot是否生效

  • 正常启动:设备应能正常启动到系统。
  • 逆向验证(关键测试) :尝试使用未签名boot.imglk.bin 通过下载工具刷入设备。如果SecureBoot已正确启用,设备应拒绝启动这些未经验证的镜像,通常会卡在开机第一屏或进入下载模式。这是验证SecureBoot功能是否生效的最直接方法。

总结与最佳实践

通过以上三个部分的详细阐述,我们完成了从基础配置 -> 自动化构建 -> 烧录验证的完整SecureBoot启用闭环。为了确保流程的顺畅与安全,请牢记以下要点:

  1. 密钥安全是根本 :根私钥 (root_prvk.pem) 是安全链的信任锚点,必须离线、加密存储,严禁放入代码仓库。
  2. Efuse烧录需谨慎:烧录Efuse是物理性熔断,一旦写入无法回退。务必在测试设备上充分验证所有流程后再对量产设备进行操作。
  3. 脚本化提升效率 :将第二部分中的 sign_image.shbuild_with_secure_boot.sh 脚本集成到您的CI/CD(持续集成/持续部署)流程中,可以极大减少人为错误,保证每次构建产出的一致性。
  4. 文档与备份 :妥善保管 generate_keys.sh 脚本输出的所有密钥文件、每次发布的固件包以及对应的 efuse.xml 配置文件。清晰的文档记录是团队协作和问题回溯的基础。

希望这份整合后的指南能帮助您和您的团队系统化地管理和实施MTK平台的SecureBoot功能,为产品构建坚实的安全基石。


参考来源

相关推荐
小心我捶你啊1 小时前
数据采集和Web解锁不是一回事,从用途到规则区分
前端·爬虫·网络协议
hunterandroid2 小时前
[鸿蒙从零到一] ArkUI 基础组件实战:Text、Image、Button 与 TextInput
前端
fsssb2 小时前
Chromium 源码学习笔记(五):一次点击,在进入 JS 之前先经历了什么?
前端
hunterandroid2 小时前
WorkManager 可靠性实战:唯一任务、重试与幂等设计
android·前端
鹿目2 小时前
使用 Vant CLI 搭建 UI 组件库:从 H5 到小程序跨平台
前端·javascript
默_笙2 小时前
😭 我花了两小时找了一个数据结构 bug,才把"迷你 Cursor"跑起来,绝望(bushi)
前端·javascript
BerrySen1782 小时前
我的AI辅助开发工具链2026版
开源·github
竹林8182 小时前
wagmi v2 监听合约事件踩坑记:从 `useContractEvent` 到 `watchContractEvent`,我重构了三版才搞定实时数据流
前端·javascript
天若有情6733 小时前
纯HTML+Tailwind单页作品集网站——零框架静态前端完整源码
前端·html
WebGirl3 小时前
H5唤起app前端实现方案
前端