行业资讯
📅 2026/7/15 11:48:52
【AOSP】构建发布版本:从生成发布密钥到系统级APK签名的完整实践
1. 为什么需要替换AOSP默认测试密钥当你第一次编译AOSP系统时可能没注意到系统默认使用的是公开的测试密钥。这些密钥存放在/build/target/product/security/目录下包括testkey、platform、shared和media四种类型。README文件里明确警告These test keys are used in development only and should NEVER be used to sign packages in publicly released images。我遇到过真实案例某厂商直接使用测试密钥发布设备结果攻击者用相同密钥签名恶意应用轻松替换了系统预装的Settings应用导致大规模数据泄露。这就是为什么所有商业设备都必须替换这些密钥。四种密钥的区别其实很有意思testkey默认签名相当于游客模式platform系统核心功能专用拥有最高权限shared联系人/家庭组共享数据使用media多媒体框架相关组件使用2. 生成自定义发布密钥2.1 密钥生成实操在AOSP根目录执行以下命令记得替换subject参数subject/CCN/STShanghai/LShanghai/OYourCompany/OUDev/CNAndroid/emailAddressdevyourcompany.com mkdir -p ~/.android-certs for x in releasekey platform shared media; do \ ./development/tools/make_key ~/.android-certs/$x $subject; \ done这里有个坑make_key会交互式询问密码直接回车表示无密码。但在生产环境我强烈建议设置强密码并配合硬件加密模块HSM保管私钥。2.2 密钥参数解析第二个参数中的DNDistinguished Name字段很有讲究/C国家代码如CN表示中国/ST省份拼音或英文/L城市建议用英文/O公司全称重要法律依据/OU部门名称如RD/Marketing/CN通用名建议用产品线名称曾经有厂商把CN设成Android结果OTA升级时与第三方应用产生签名冲突。建议采用公司名产品线的命名方式。3. 修改系统签名配置3.1 关键配置修改点设备mk文件如device/xxx/xxx.mkPRODUCT_DEFAULT_DEV_CERTIFICATE : vendor/yourcompany/security/releasekeyMakefile全局配置build/core/Makefileifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),vendor/yourcompany/security/releasekey) BUILD_KEYS : release-keys endif密钥策略文件system/sepolicy/private/keys.confENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem3.2 验证签名是否生效编译后检查以下位置adb shell getprop ro.build.tags # 应显示release-keys adb shell grep BUILD_SECURE /system/etc/build.prop # 应显示true遇到过有开发者修改配置后签名未生效最后发现是out目录未清理导致缓存问题。建议每次修改后执行make clean make -j164. 系统级APK签名实战4.1 手动签名APK使用AOSP内置工具签名java -jar out/host/linux-x86/framework/signapk.jar \ vendor/yourcompany/security/platform.x509.pem \ vendor/yourcompany/security/platform.pk8 \ input.apk output-signed.apk4.2 自动化签名流程在Android.mk中添加LOCAL_CERTIFICATE : platform # 或releasekey/shared/media如果是Android.bpandroid_app { certificate: platform, ... }4.3 生成Keystore文件方便应用开发团队使用系统签名openssl pkcs8 -inform DER -nocrypt \ -in platform.pk8 -out platform.pem openssl pkcs12 -export \ -in platform.x509.pem -inkey platform.pem \ -out platform.p12 -name platform -password pass:android keytool -importkeystore \ -deststorepass android -destkeystore platform.jks \ -srckeystore platform.p12 -srcstoretype PKCS12 \ -srcstorepass android5. 高级技巧与避坑指南5.1 签名验证强化在BoardConfig.mk中添加BOARD_AVB_ENABLE : true BOARD_AVB_ALGORITHM : SHA256_RSA40965.2 常见问题解决问题1签名后APK安装失败解决检查APK的AndroidManifest.xml是否声明了sharedUserIdmanifest xmlns:androidhttp://schemas.android.com/apk/res/android android:sharedUserIdandroid.uid.system问题2系统服务权限拒绝解决在sepolicy中添加对应权限allow system_app your_service:service_manager find;5.3 密钥轮换策略Android 9支持APK签名方案v3的密钥轮换。在signapk命令中添加--rotation-min-sdk-version 28 \ --previous-signer \ vendor/yourcompany/security/old_key.x509.pem \ vendor/yourcompany/security/old_key.pk86. 发布版本签名全流程6.1 完整构建命令make -j16 dist ./build/tools/releasetools/sign_target_files_apks \ -o --default_key_mappings ~/.android-certs \ out/dist/*-target_files-*.zip signed-target_files.zip ./build/tools/releasetools/ota_from_target_files \ -k ~/.android-certs/releasekey \ signed-target_files.zip ota_update.zip6.2 安全建议将私钥存储在独立的安全服务器构建服务器与密钥服务器间使用HSM加密通信每次发布后更新密钥备份实施双人复核机制记得某次凌晨3点紧急发布时因为密钥管理员休假导致整个团队干等8小时。后来我们实施了密钥分片保管方案避免单点故障。7. 验证与调试7.1 签名验证命令# 验证APK签名 apksigner verify -v --print-certs app.apk # 验证系统镜像 avbtool verify_image --image vbmeta.img --key releasekey_public.pem7.2 调试技巧在init.rc中添加on property:ro.boot.verifiedbootstateorange setprop ro.debuggable 1 setprop ro.adb.secure 0这样即使签名验证失败orange状态也能保留调试权限。当然生产环境记得关闭整个过程就像给系统打造一把独一无二的数字钥匙既要保证安全性又要考虑实际开发效率。建议首次实施时预留完整两天时间毕竟密钥一旦投入使用后续变更成本很高。