Android16 EDLA 签名文件替换总结

Android16 EDLA 签名文件替换总结

一、前言

Android 系统开发如果是从AOSP 代码修改为EDLA项目需要把一些签名文件修改,不然EDLA认证会有报错Failed。

修改替换的签名文件不仅仅是系统的签名文件,还有一些重要应用的签名文件;

这个修改系统签名文件和应用签名文件应该是在EDLA初版提测前修改的;

不然BTS的认证项就会有很多应用签名报错。

比如下面的BTS报错日志:

//com.android.shell
This build contains pre-installed "com.android.shell" at /system/priv-app/Shell/Shell.apk which has been signed by a certificate that is known to be compromised and should be replaced.
 It is also using a shared user id that can have higher privileges. If you believe this finding is incorrect please reach out to your TAM and provide details that help us to validate inaccuracies and improve detection.
 
 //com.android.nfcservices
 This build contains pre-installed "com.android.nfcservices" at /system/apex/com.android.nfcservices.
capex/original_apex which has been signed by an example private key that's available publicly in AOSP. 
Find more information at https://docs.partner.android.com/security/advisories/2023/advisory-2023-11 If you believe this finding is incorrect 
please reach out to your TAM and provide details that help us to validate inaccuracies and improve detection.

//android
This build contains pre-installed "android" at /system/framework/framework-res.apk which has been signed by a certificate that is known to be compromised and should be replaced. 
If you believe this finding is incorrect please reach out to your TAM and provide details that help us to validate inaccuracies and improve detection.

上面只是简单举例,实际还有十几个类似的错误。看起来是签名问题,可以先修改一次签名再重新测试BTS。

BTS除了签名信息报错,还有很多应用权限的报错,本文主要处理签名文件的问题。

下面是EDLA 认证过程需要修改的签名文件总结。

二、签名信息的生成命令

1、生成签名信息文件的命名模版

不管是生成系统签名文件还是应用签名文件都是下面三个命令:

1、development/tools/make_key keyName 'XXX' 
2、openssl genrsa -out keyName.pem 4096
3、external/avb/avbtool.py  extract_public_key --key keyName.pem --output keyName.avbpubkey

上面命令基本都是固定的,只要把XXX和keyName替换成对应的信息就可以了。

下面是三条命令的简介:

(1)第一行代码,make_key 生成 keyName.pk8(私钥)和 keyName.x509.pem(公钥证书);
keyName,是key名称,可以是应用包名/系统模块名称,
XXX是公司信息,一般是固定的格式,包含公司大概地理位置、名称、邮箱等信息;
第一行代码输入后,会提示是否设置密码,一般不用设置,按回车Enter就可以执行完毕,生成签名文件。

(2)第一行代码,openssl genrsa 生成 keyName.pem(AVB 签名私钥);
4096 不是固定值,它代表 RSA 密钥的「长度(单位:比特)」,核心影响密钥的安全级别和性能开销;
4096 是 Android 10+ 的「推荐值」,可修改为 2048(不推荐)、3072(过渡)、8192(特殊场景)。

(3)第三行代码,avbtool 提取 keyName.avbpubkey(AVB 校验公钥);

一般系统签名信息文件使用第一条命令就可以了,应用签名文件的生成就需要用到第二条和第三条命令。

2、签名核心文件对比总表

文件名核心作用格式类型用途场景安全性要求
keyName.pk8私钥文件(用于组件签名)PKCS#8 二进制私钥蓝牙 APK/APEX 模块 / 服务的签名绝对保密(泄露会导致签名伪造)
keyName.x509.pem公钥证书(包含公钥 + 证书元信息)X.509 文本证书(PEM 编码)验证组件的签名合法性可公开(用于校验签名)
keyName.pem私钥文件(与 pk8 是同一份私钥的不同格式)PKCS#1 文本私钥(PEM 编码)组件签名(兼容旧工具 / 场景)绝对保密(同 pk8)
keyName.avbpubkeyAVB 镜像校验公钥(验证镜像完整性)AVB 专用公钥格式APEX 模块 / 系统镜像的启动校验可公开(设备端用于校验)

签名两个签名文件.pk8、.x509.pem,不管是系统签名文件还是应用签名文件都是存在的;

后面两个签名文件.pem、.avbpubkey,是应用签名或者模块签名才需要的。

就四个签名文件,多看几次就记得了,我刚开始看也是一辆懵逼。

比如容易混淆的是第二行的代码有 4096 ,而签名文件中有509,还以为他们有啥关联呢,其实没有。

思考:keyName可以随意定义吗?
好像是可以的(自行确认),都是可以生成签名文件的,但是使用的时候需要修改成固定的名称才能使用。

3、生成签名信息的文件在哪里执行?

签名信息文件是在完整的系统源码下执行的;

首先保证系统源码代码环境ok,比如已经source 、lunch环境,可以正常单编应用或者大包的情况;

一般是源码的release 根目录执行上面的代码,生成的文件也是生成在release目录;

执行后可以ls 或 ls -l 查看根目录是否生成对应的文件。

4、生成签名信息文件的示例(蓝牙签名)

development/tools/make_key com.android.btservices '/C=CN/ST=Guangdong/L=Shenzhen/O=KXX/OU=KXX/CN=KXX/emailAddress=gmsXX@kXX.cn'

openssl genrsa -out com.android.btservices.pem 4096

external/avb/avbtool.py  extract_public_key --key com.android.btservices.pem --output com.android.btservices.avbpubkey

使用上面签名后就可以生成如下文件:

-rw-rw-r--   1 liwz liwz   1032 Nov 24 22:50 com.android.btservices.avbpubkey
-rw-------   1 liwz liwz   3243 Nov 24 22:49 com.android.btservices.pem
-rw-------   1 liwz liwz   1218 Nov 24 22:49 com.android.btservices.pk8
-rw-rw-r--   1 liwz liwz   1395 Nov 24 22:49 com.android.btservices.x509.pem

蓝牙和nfc不仅有应用签名,还有系统签名,所以是需要修改替换两个地方的,

可以看看下面之前的介绍,Android EDLA项目导入mainline包后蓝牙签名报错分析解决:

https://blog.csdn.net/wenzhi20102321/article/details/154202784

有了生成签名命令,就可以继续往后看需要生成和替换那些签名呢?

系统那么多签名文件怎么看?

把系统签名和应用签名分开看,系统签名是在同一个目录下的,应用签名是在不同目录下存放的。

二、系统签名的替换

1、系统签名文件在目录

release/build/make/target/product/security

主要是修改的签名文件有:bluetooth、media、networkstack、nfc、platform、releasekey、shared、testkey等8个。

每个签名文件对应什么信息呢?

2、Android16系统源码签名文件目录示例

Android16/release/build/make/target/product/security$ ls -l
total 96
-rw-rw-r-- 1 liwz liwz 1379 Oct 28 15:35 Android.bp
-rw-rw-r-- 1 liwz liwz 1217 Nov 24 19:13 bluetooth.pk8
-rw-rw-r-- 1 liwz liwz 1391 Nov 24 19:13 bluetooth.x509.pem
-rw-rw-r-- 1 liwz liwz 1217 Oct 28 15:35 cts_uicc_2021.pk8
-rw-rw-r-- 1 liwz liwz 1464 Oct 28 15:35 cts_uicc_2021.x509.pem
-rw-rw-r-- 1 liwz liwz 1484 Oct 28 15:35 fsverity-release.x509.der
-rwxrwxr-x 1 liwz liwz 1217 Nov 24 14:02 media.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 media.x509.pem
-rwxrwxr-x 1 liwz liwz 1217 Nov 24 14:02 networkstack.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 networkstack.x509.pem
-rwxrwxr-x 1 liwz liwz 1217 Nov 24 14:02 nfc.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 nfc.x509.pem
-rwxrwxr-x 1 liwz liwz 1218 Nov 24 14:02 platform.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 platform.x509.pem
-rw-rw-r-- 1 liwz liwz 4247 Oct 28 15:35 README
-rwxrwxr-x 1 liwz liwz 1217 Nov 24 14:02 releasekey.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 releasekey.x509.pem
-rw-rw-r-- 1 liwz liwz 1219 Oct 28 15:35 sdk_sandbox.pk8
-rw-rw-r-- 1 liwz liwz 1464 Oct 28 15:35 sdk_sandbox.x509.pem
-rwxrwxr-x 1 liwz liwz 1218 Nov 24 14:02 shared.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 shared.x509.pem
-rwxrwxr-x 1 liwz liwz 1217 Nov 24 14:02 testkey.pk8
-rwxrwxr-x 1 liwz liwz 1391 Nov 24 14:02 testkey.x509.pem
Android16/release/build/make/target/product/security$ 

可以看到除了上面说的主要的系统签名文件,还有其他比如cts_uicc_2021、sdk_sandbox。

可以看到每个签名文件都有.pk8、.x509.pem,两个对应的签名信息文件。

如果要重新生成platform系统级签名代码示例:

development/tools/make_key platform '/C=CN/ST=Guangdong/L=Shenzhen/O=KXX/OU=KXX/CN=KXX/emailAddress=gmsXX@kXX.cn'

这个platform 签名文件,也是普通应用设置uid,获取到系统签名的关键。

其他的系统签名也是同样生成,把 platform 替换成对应的关键字即可。

3、EDLA项目需要替换的签名文件参考示例列表

development/tools/make_key testkey   '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key platform    '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key shared      '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key media        '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key releasekey   '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key networkstack   '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key bluetooth   '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key nfc   '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

上面的签名文件基本都要替换,最好一个个生成,因为中间会需要输入密码;

如果整个代码片段复制粘贴到源码运行,有可能会出现有些签名文件未生成。

三、应用签名的替换

1、系统签名文件在目录

应用签名的文件比较分散,主要在 packages/modules 下面的不同模块应用里面,也有个别在其他目录。

2、Android16应用签名文件目录示例

下面都会Android16 中应用签名的搜索结果:

release/packages/modules$ find . -name  *.pk8
./CrashRecovery/apex/com.android.crashrecovery.pk8
./Profiling/apex/com.android.profiling.pk8
./common/javatests/com/android/modules/updatablesharedlibs/apex/com.android.modules.updatablesharedlibs.pk8
./common/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pk8
./AdServices/adservices/apk/com.android.adservices.api.pk8
./AdServices/sdksandbox/tests/keys/sdksandbox-test.pk8
./AdServices/apex/com.android.adservices.pk8
./UprobeStats/apex/com.android.uprobestats.pk8
./Uwb/service/ServiceUwbResources/resources-certs/com.android.uwb.resources.pk8
./Uwb/ranging/test_app/com.android.ranging.rangingtestapp.pk8
./Uwb/apex/com.android.uwb.pk8
./DeviceLock/apex/com.android.devicelock.pk8
./StatsD/apex/com.android.os.statsd.pk8
./Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8
./Connectivity/Tethering/apex/com.android.tethering.pk8
./ThreadNetwork/apex/com.android.threadnetwork.pk8
./AppSearch/com.android.appsearch.pk8
./AppSearch/apk/com.android.appsearch.apk.pk8
./DnsResolver/apex/testcert.pk8
./OnDevicePersonalization/federatedcompute/apk/com.android.federatedcompute.pk8
./OnDevicePersonalization/apex/com.android.ondevicepersonalization.pk8
./ExtServices/apex/com.android.extservices.pk8
./NeuralNetworks/apex/com.android.neuralnetworks.pk8
./GeoTZ/apex/com.android.geotz/com.android.geotz.pk8
./Bluetooth/android/app/certs/com.android.bluetooth.pk8
./Bluetooth/apex/com.android.btservices.pk8
./Bluetooth/apex/key/com.android.bt.pk8
./SdkExtensions/com.android.sdkext.pk8
./Telephony/apex/com.android.telephonymodules.pk8
./Scheduling/apex/com.android.scheduling.pk8
./RuntimeI18n/apex/com.android.i18n.pk8
./IPsec/apex/com.android.ipsec.pk8
./HealthFitness/apk/com.android.healthconnect.controller.pk8
./HealthFitness/backuprestore/com.android.health.connect.backuprestore.pk8
./HealthFitness/apex/com.android.healthfitness.pk8
./adb/apex/com.android.adbd.pk8
./RemoteKeyProvisioning/apex/com.android.rkpd.pk8
./Wifi/service/ServiceWifiResources/resources-certs/com.android.wifi.resources.pk8
./Wifi/OsuLogin/certs/com.android.hotspot2.osulogin.pk8
./Wifi/WifiDialog/certs/com.android.wifi.dialog.pk8
./Wifi/apex/com.android.wifi.pk8
./Nfc/apex/com.android.nfcservices.pk8
./ConfigInfrastructure/apex/com.android.configinfrastructure.pk8
./vndk/apex/com.android.vndk.pk8
./Virtualization/build/compos/com.android.compos.pk8
./Virtualization/build/apex/com.android.virt.pk8
./Virtualization/tests/testapk/microdroid_test_app.pk8
./Permission/com.android.permission.pk8
./Permission/SafetyCenter/Resources/com.android.safetycenter.resources.pk8

release/packages/modules$ 

看起来很多,实际上不用替换那么多,但是好像也不少。

3、EDLA项目需要替换的签名文件参考示例列表

应用签名信息文件需要分别生成四个,所以需要三条命令:

(1) make_key
development/tools/make_key com.android.btservices '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.nfcservices '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.i18n '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.runtime '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.virt '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.vndk '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.vndk.v34 '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.vndk.current '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.uwb '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.rkpd '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.devicelock '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

development/tools/make_key com.android.compos '/C=CN/ST=Guangdong/L=Shenzhen/O=kxx/OU=kxx/CN=kxx/emailAddress=gms@kxx.cn'

make_key 最好还是一个个确认生成,下面的命令基本可以直接复制使用;

每个命令后面加了空行,也是相当于回车确认了。

(2)openssl genrsa
openssl genrsa -out com.android.btservices.pem 4096

openssl genrsa -out com.android.nfcservices.pem 4096

openssl genrsa -out  com.android.i18n.pem 4096

openssl genrsa -out  com.android.runtime.pem 4096

openssl genrsa -out  com.android.virt.pem 4096

openssl genrsa -out  com.android.vndk.pem 4096

openssl genrsa -out  com.android.vndk.vn34.pem 4096

openssl genrsa -out  com.android.vndk.current.pem 4096

openssl genrsa -out  com.android.uwb.pem 4096

openssl genrsa -out  com.android.rkpd.pem 4096

openssl genrsa -out  com.android.devicelock.pem 4096

openssl genrsa -out  com.android.compos.pem 4096

(3)external
external/avb/avbtool.py  extract_public_key --key com.android.btservices.pem --output com.android.btservices.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.nfcservices.pem --output com.android.nfcservices.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.i18n.pem --output  com.android.i18n.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.runtime.pem --output  com.android.runtime.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.virt.pem --output  com.android.virt.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.vndk.pem --output  com.android.vndk.pubkey

external/avb/avbtool.py  extract_public_key --key com.android.vndk.vn34.pem --output  com.android.vndk.vn34.pubkey

external/avb/avbtool.py  extract_public_key --key com.android.vndk.current.pem --output  com.android.vndk.current.pubkey

external/avb/avbtool.py  extract_public_key --key com.android.uwb.pem --output  com.android.uwb.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.rkpd.pem --output  com.android.rkpd.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.devicelock.pem --output  com.android.devicelock.avbpubkey

external/avb/avbtool.py  extract_public_key --key com.android.compos.pem --output  com.android.compos.avbpubkey

正常应用的签名文件信息,生成四个后,在对应的 apex 目录把四个签名文件覆盖即可。

上面虽然命令很多,但是EDLA报错估计是会有,之前总结是上面的都要替换。

3、但是也有两种特殊情况:

(1)vndk目录需要多添加几个文件:

在这里插入图片描述

不需要替换原来的文件?

具体原理和为啥我也不清楚,是之前EDLA项目报错总结出来的;

(2)bionic 模块签名文件不在 package 下面

在这里插入图片描述

可以看到它是直接在release根目录下面的。

bionic 是 Android 系统的底层 C/C++ 运行时库(Runtime),相当于 Linux 系统的 glibc(GNU C 库);

支撑 Android 系统内核、Framework、原生应用(NDK 开发)的所有底层操作。

四、其他

1、小结

(1)EDLA认证项需要修改替换的签名文件不仅仅是系统的签名文件,还有一些重要模块的签名文件;
(2)签名两个签名文件.pk8、.x509.pem,不管是系统签名文件还是应用签名文件都是存在的;
(3)两个签名文件.pem、.avbpubkey,是应用签名或者模块签名才需要的;
(4)签名信息文件是在完整的系统源码下执行的,首先保证系统源码代码环境ok;

2、从Android源码中生成系统签名文件.jks签名文件生成

本文介绍如何从Android源码环境中生成签名文件。
注意,需要源码环境哦,window环境是会报错的!

https://blog.csdn.net/wenzhi20102321/article/details/134898404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值