Android Safety 系列专题【篇一:系统签名】

本篇提到的应用签名,其实就是指android系统编译构建过程中,对应用包的签名。

相关的定义和说明Android源代码中的/build/target/product/security/的内容:

如上的官方介绍文档:https://source.android.com/devices/tech/ota/sign_builds.html

  • 其中pk8文件是私钥文件,PKCS#8 DER格式的文件
  • 其中x509.pem文件是证书文件,PEM格式。

1、目的和作用?

  • 为什么要针对apk包进行签名?同google官方网站的描述,如果你更新apk的时候,系统会检测你的apk的签名秘钥是否和系统指定的签名秘钥匹配,如果不匹配,系统将会拒绝安装改应用,这样能够保证被更新的应用是没有掉过包的。
  • 为什么要针对ota包进行签名?同前面提到的apk应用一样,OTA包其实也可以简单的理解为一个大型apk,我们在安装OTA包之前需要对其进行校验(通过RecoverySystem.verifyPackage()),如果签名秘钥对不匹配,讲拒绝OTA升级,同样保证被更新的OTA是没有掉过包的。

2、长什么样子?

每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥。 私钥需要加以保密,并用于对 apk 包进行签名。 密钥本身也可能受密码保护。相比之下,证书只包含公开的一半密钥,因此可以大范围地分发。证书用于验证某个 apk 包是否由相应的私钥进行签名。

标准 Android build 使用四个密钥,所有这些密钥都位于 build/target/product/security

  • testkey:适用于未另外指定密钥的 apk 包的通用默认密钥。
  • platform:适用于核心平台所包含的 apk 包的测试密钥。
  • shared:适用于家庭/联系人进程中的共享内容的测试密钥。
  • media:适用于媒体/下载系统所包含的 apk 包的测试密钥。
  • networkstack:适用于网络系统所包含的 apk 包的测试密钥

3、如何客制化?

通常android源码默认使用了aosp的应用签名中的testkey,如上目录/build/target/product/security/目录下的testkey签名,然而这套签名是aosp的公共测试签名,因此安全系统极低,在XTS等测试中会对其进行拦截,通常我们会定制我们自己的应用签名。如下步骤介绍如何指定厂商自己的应用签名:

步骤一:如何生成APK应用签名文件?

在android根目录/build/target/product/security/有详细说明如何生成秘钥对,其中

在项目开发过程中,我们通常需要更换上面的秘钥对,使用客户提供或者我们自己的秘钥对,生成方式如上。

步骤二:如何集成APK应用签名文件?

我们可以通过宏变量PRODUCT_DEFAULT_DEV_CERTIFICATE来指定如上步骤生成的签名文件的路径。如ChatGPT的回答:

步骤三:如何使用APK应用签名文件?

  • Android编译构建的时候引入KEY
  • 应用集成的时候指定使用的KEY
bash 复制代码
include $(CLEAR_VARS)
LOCAL_MODULE := AOSPLauncherR
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform   //指定平台签名
LOCAL_PRIVILEGED_MODULE := true
LOCAL_REQUIRED_MODULES := privapp_permissions_AOSPLauncherR.xml
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3 \
    Launcher3QuickStep Launcher3Go Launcher3QuickStepGo \
    MtkLauncher3 MtkLauncher3QuickStep MtkLauncher3Go MtkLauncher3QuickStepGo MtkLauncher3GoIconRecents
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := privapp_permissions_AOSPLauncherR.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_PRODUCT_MODULE := true
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

这里集成的AOSPLauncherR因为是平台的应用,LOCAL_CERTIFICATE = platform,因此编译构建的时候针对AOSPLancherR应用会使用步骤一中指定的plat签名文件进行签名

bash 复制代码
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := MobileFeliCaSettingApp
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
# indicate to generate .odex file in special built/core/prebuilt.mk
LOCAL_DEX_PREOPT:=true
include $(BUILD_PREBUILT)

这里集成的MobileXXX应用是三方应用,使用LOCAL_CERTIFICATE := PRESIGNED,因此编译构建的时候使用的是testKey?

4、相关案例

案例一:因为APK应用签名为系统默认,导致XTS问题

CtsSecurityTestCases

如上报错日志表示一堆应用使用了android默认的应用签名,解决方案就是生成新的应用签名文件

GtsAppBlacklistDeviceTestCases

如上报错日志表示一堆应用使用了android默认的应用签名,解决方案就是生成新的应用签名文件

GtsMbaPrivilegedPermissionTestCases

testPackageSignatures和testForBlacklistedApps和testMbaPrivilegedPermission 这样的测试用例是针对APK应用签名的校验,即编译的时候需要对所有应用或者OTA包进行应用签名,使用默认android的签名就会被检查出来,解决方案就是更新自己的应用签名

BTS which has been signed by a certificate that is known to be compromised and should be replaced

是针对系统应用签名的一个检测,即编译的时候需要对所有应用或者OTA包进行应用签名,使用默认android的签名就会被检查出来,解决方案就是更新自己的应用签名

案例二:因为APK应用签名不匹配,导致OTA无法正常升级

相关推荐
ll_god2 小时前
android gradle中如何引用 libs.versions.toml中定义的版本变量添加compose引用
android
行稳方能走远3 小时前
Android C++ 学习笔记
android·c++
2501_946230983 小时前
Cordova&OpenHarmony用户账户管理
android·javascript
x66ccff3 小时前
Claude Code 安装方法
android·java·数据库
码农搬砖_20203 小时前
【一站式学会compose】 Android UI体系之 Image的使用和介绍
android·image·compose·content·contentscale·scaletype
粤M温同学3 小时前
Android Room数据库的基本使用
android·数据库
lkbhua莱克瓦244 小时前
基础-约束
android·开发语言·数据库·笔记·sql·mysql·约束
戴西软件4 小时前
CAxWorks.VPG车辆工程仿真软件:打造新能源汽车安全的“数字防线“
android·大数据·运维·人工智能·安全·低代码·汽车
ljt27249606614 小时前
Compose笔记(六十三)--SegmentedButton
android·笔记·android jetpack