本篇提到的应用签名,其实就是指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的签名就会被检查出来,解决方案就是更新自己的应用签名