Android 签名机制深度解析:从 LOCAL_CERTIFICATE 到权限许可名单的 3 层控制

📅 2026/7/8 13:07:52
Android 签名机制深度解析:从 LOCAL_CERTIFICATE 到权限许可名单的 3 层控制
Android 签名机制的三重控制体系从 LOCAL_CERTIFICATE 到权限许可名单在 Android 生态系统中签名机制构成了应用安全架构的核心支柱。不同于普通应用开发者关注的单一 APK 签名场景系统级开发需要理解从模块编译到权限管理的完整控制链条。本文将深入剖析 Android 签名体系的三层控制机制揭示系统签名、权限授予与安全策略之间的内在关联。1. 基础签名层Android.mk 中的证书控制Android 的编译系统通过LOCAL_CERTIFICATE变量实现对模块签名的第一层控制。这个在 Android.mk 中定义的变量决定了当前模块将使用哪类系统证书进行签名。常见的证书类型包括LOCAL_CERTIFICATE : platform # 使用平台核心证书 LOCAL_CERTIFICATE : media # 多媒体相关证书 LOCAL_CERTIFICATE : shared # 共享数据证书 LOCAL_CERTIFICATE : PRESIGNED # 保留原始签名当未指定LOCAL_CERTIFICATE时系统会根据编译模式自动选择默认证书编译模式默认证书典型用途ENG/DEBUGtestkey开发调试USERreleasekey正式发布USERDEBUGreleasekey调试版本关键差异PRESIGNED与系统证书的本质区别在于PRESIGNED 保留第三方原有签名无法获取系统权限系统证书签名的应用可声明android:sharedUserId共享系统进程空间2. 系统密钥层产品级签名定制厂商通常会替换 AOSP 默认的 testkey在设备产品定义中指定自定义密钥# device/vendor/product/product.mk PRODUCT_DEFAULT_DEV_CERTIFICATE : vendor/xxx/android-certs/releasekey这种定制通过覆盖build/core/config.mk中的默认定义实现ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE DEFAULT_SYSTEM_DEV_CERTIFICATE : $(PRODUCT_DEFAULT_DEV_CERTIFICATE) else DEFAULT_SYSTEM_DEV_CERTIFICATE : build/make/target/product/security/testkey endif密钥配置文件如keys.conf则定义了不同编译模式下证书的映射关系[PLATFORM] ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem [RELEASE] ENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem注意密钥文件包含一对非对称密钥.pk8- 私钥文件必须严格保密.x509.pem- 公钥证书用于签名验证3. 权限控制层Android 15 的签名许可名单Android 15 引入了签名权限许可名单机制将权限控制提升到新的维度。该系统要求应用必须在etc/permissions/目录下的配置文件中显式声明其需要的特权权限!-- platform.xml 示例 -- permissions privapp-permissions packagecom.example.privileged permission nameandroid.permission.INSTALL_PACKAGES/ permission nameandroid.permission.CONTROL_DEVICE_LIGHTS/ /privapp-permissions /permissions许可名单的验证流程分为三个阶段编译时检查在编译阶段验证权限声明与签名匹配安装时验证PackageManager 检查权限-签名映射关系运行时保护系统服务拒绝未授权的权限调用新旧机制对比特性传统签名权限Android 15 许可名单权限获取方式自动授予同签名应用需显式声明权限范围全部或无可精细化控制验证时机安装时一次验证持续运行时验证兼容性支持旧应用仅适用于 targetSDK344. 实战系统签名全流程让我们通过一个典型场景串联这三层机制4.1 准备签名材料生成平台签名密钥对subject/CUS/STCalifornia/LMountain View/OAndroid/OUAndroid/CNAndroid mkdir -p ~/.android-certs for cert in platform shared media; do ./development/tools/make_key ~/.android-certs/$cert $subject done4.2 配置产品签名在产品定义中指定自定义密钥# device/vendor/product/product.mk PRODUCT_DEFAULT_DEV_CERTIFICATE : vendor/xxx/android-certs/releasekey BUILD_KEYS : release-keys4.3 编译系统应用在应用模块中声明系统签名# packages/apps/SystemApp/Android.mk LOCAL_CERTIFICATE : platform LOCAL_PRIVILEGED_MODULE : true4.4 配置权限许可在系统配置中添加权限白名单!-- system/etc/permissions/privapp-permissions-product.xml -- privapp-permissions packagecom.android.systemapp permission nameandroid.permission.MANAGE_DEVICE_ADMINS/ /privapp-permissions4.5 签名验证使用 apksigner 验证签名链apksigner verify -v --print-certs SystemApp.apk5. 深度技术解析5.1 签名与 UID 的关联机制Android 通过签名实现 UID 分配的三种模式普通应用自动分配唯一 UID共享 UID相同签名相同 sharedUserId 共享 UID系统 UID平台签名可获得固定系统 UID如 system/radio// frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java final int uid newUser null ? UserHandle.getUserId(uid) : newUser; if (sharedUserId ! null) { // 检查签名一致性 verifySignaturesLP(pkgSetting, ps); uid mSettings.getSharedUserLP(sharedUserId, pkgSetting, ...).userId; }5.2 签名版本演进Android 签名方案的迭代版本引入版本算法验证方式v11.0JAR 签名校验 MANIFEST.MFv27.0APK 签名方案校验整个 APK 二进制v39.0密钥轮换支持签名证书更新v411.0增量签名为增量交付优化5.3 签名权限的 SELinux 集成现代 Android 将签名与 SELinux 策略深度整合# system/sepolicy/private/app.te allow privapp_domain { -apk_data_file -app_data_file }:file rw_file_perms; # 签名到域的转换 typeattribute platform_app mlstrustedsubject;6. 疑难问题排查6.1 常见签名错误INSTALL_PARSE_FAILED_NO_CERTIFICATES: No signature INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: Signature mismatch INSTALL_FAILED_DUPLICATE_PERMISSION: Conflicting permission6.2 调试技巧检查当前设备证书指纹adb shell grep -A1 ro.build.fingerprint /system/build.prop验证权限白名单配置adb shell dumpsys package permissions | grep -A5 Privileged6.3 签名工具链对比工具支持格式典型用途优势signapk.jarv1系统应用签名与 AOSP 构建系统集成apksignerv2/v3应用商店发布支持最新签名方案jarsignerv1传统 Java 签名兼容旧系统7. 未来演进方向随着 Android 15 的发布签名机制正在向更精细化的权限控制发展模块化权限按功能拆分权限组减少过度授权动态权限证书支持运行时证书更新硬件绑定与 Titan M2 等安全芯片深度集成量子安全准备抗量子计算的签名算法在实践中最深刻的体会是系统签名的核心不在于技术实现而在于建立完整的信任链。每次签名操作都应该被视为一次安全承诺这种理念在 Android 15 的许可名单机制中得到了完美体现。