根据您的要求,我为您整理了一份可直接发布到博客平台的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。
- 准备工具 :获取
FLASHLIB_DA_EXE(Official)_ALPS工具包,并安装配套的GCC和GnuWin32 。 - 配置环境 :修改工具包内
base.mk中的GCCDIR路径,指向你的GCC工具链。 - 替换公钥 :将上一步生成的
oemkey.h文件,覆盖到工具包的custom/MT6761/目录下。 - 编译未签名DA :在工具包的
buildspec目录下执行make BBCHIP=MT6761,生成MTK_AllInOne_DA.bin。 - 签名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. 烧录前准备
- 获取工具 :使用
SP_MDT工具进行烧录。 - 准备文件 :将签名后的所有镜像文件、已签名的
MTK_AllInOne_DA-resing.bin、auth_sv5.auth以及efuse_MT6761.xml配置文件放在同一目录。 - 修改Efuse配置 :
- 打开
SP_MDT工具目录下的Efuse.ini,设置Enable = 1,并指定EfuseXmlPath为你的efuse_MT6761.xml文件路径 。 - 编辑
efuse_MT6761.xml,确保其中的pub-key-n字段值与之前生成的oemkey.h文件中的公钥数据完全一致 。
- 打开
2. 烧录流程
- 扫描设备 :在SP Flash Tool中选择
BootRom+PreLoader模式,点击扫描,然后给设备断电再上电,等待工具识别设备 。 - 烧写Efuse :点击
Write Efuse按钮。此操作不可逆,请再三确认公钥配置正确 。 - 下载固件 :Efuse烧写成功后,勾选所有需要下载的已签名镜像分区,点击
Download按钮,将固件烧录到设备中 。
3. 验证SecureBoot是否生效
- 正常启动:设备应能正常启动到系统。
- 逆向验证(关键测试) :尝试使用未签名 的
boot.img或lk.bin通过下载工具刷入设备。如果SecureBoot已正确启用,设备应拒绝启动这些未经验证的镜像,通常会卡在开机第一屏或进入下载模式。这是验证SecureBoot功能是否生效的最直接方法。
总结与最佳实践
通过以上三个部分的详细阐述,我们完成了从基础配置 -> 自动化构建 -> 烧录验证的完整SecureBoot启用闭环。为了确保流程的顺畅与安全,请牢记以下要点:
- 密钥安全是根本 :根私钥 (
root_prvk.pem) 是安全链的信任锚点,必须离线、加密存储,严禁放入代码仓库。 - Efuse烧录需谨慎:烧录Efuse是物理性熔断,一旦写入无法回退。务必在测试设备上充分验证所有流程后再对量产设备进行操作。
- 脚本化提升效率 :将第二部分中的
sign_image.sh和build_with_secure_boot.sh脚本集成到您的CI/CD(持续集成/持续部署)流程中,可以极大减少人为错误,保证每次构建产出的一致性。 - 文档与备份 :妥善保管
generate_keys.sh脚本输出的所有密钥文件、每次发布的固件包以及对应的efuse.xml配置文件。清晰的文档记录是团队协作和问题回溯的基础。
希望这份整合后的指南能帮助您和您的团队系统化地管理和实施MTK平台的SecureBoot功能,为产品构建坚实的安全基石。