关于platform签名和key

本文详细介绍了公钥和私钥的概念,以及在数字证书中的应用。在Android系统中,每个应用都需要使用数字证书进行签名,以确保应用的来源和更新的合法性。签名过程涉及到公钥加密和私钥解密,保证了信息的安全传输。同时,Android要求应用的更新必须保持签名的一致性。此外,文中还阐述了如何对APK进行签名,以及签名过程中可能出现的问题和解决方案。签名策略对于应用的升级、模块化和权限控制等方面具有重要意义。

1、公钥和私钥的概念

在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是公开密钥算法(也叫非对称算法、双钥算法)”,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。

2、证书的概念

数字证书则是由证书认证机构(CA)对证书申请者真实之身份验证后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人都可以查询和下载,因此数字证书和公钥一样是公开的。实际上,数字证书就是经过CA认证过的公钥。

原则:

  • 一个公钥对应一个私钥。
  • 密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
  • 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
  • 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
  • 非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的

3、基于公开密钥的加密过程

比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

  • Bob将他的公开密钥传送给Alice。
  • Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
  • Bob用他的私人密钥解密Alice的消息。

Android中的签名:

是什么签名?

Android要求所有已安装的应用程序都使用数字证书做数字签名,数字证书的私钥由应用开发者持有,

Android使用证书作为标示应用程序作者的一种方式,并在应用程序之间建立信任的关系。 证书并不用来控制用户能否安装哪个应用。证书不需要由证书认证中心签名;完全可以使用自制签名证书。

没有正确签名的应用,Android系统不会安装或运行。此规则适用于在任何地方运行的Android系统,不管是在模拟器还是真实设备上。因为这个原因。在真机或模拟器上运行或者调试应用前,必须为其设置好签名。

为什么要有签名?

开发Android的人这么多,完全有可能把类名,包名命名成同样的名字,这个时候该如何区分?所以,这时候就需要签名来区分了,由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。

发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在Android应用和框架中有着十分重要的作用。例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致。

签名策略

应用程序签名的一些方面可能会影响应用程序的开发过程, 尤其是当你计划发布多个应用时. 通常情况下, 对于所有开发者而言,推荐的策略是:在应用程序的整个生命周期,所有的应用程序使用相同的证书签名.

为什么这么做的原因:

  • 应用程序升级 – 当发布应用的更新时, 如果想让用户无缝地升级到新版本, 需要继续使用相同的某个或者某一套证书来签名更新包.当系统安装应用的更新时, 它会比较现有版本和新版本的证书. 如果证书吻合, 包括证书数据和顺序都吻合, 那么系统允许更新.如果新版本所做的签名不是匹配的, 那么将需要给应用起一个不同的包名 — 在这种情况下, 用户相当于安装了一个完全的新程序.
  • 应用程序模块化 – Android允许由相同证书签名的应用程序运行在相同的进程中, 此时系统会将它们作为单个应用程序对待.在这种方式中, 可以按模块化的方式部署应用, 用户可以根据需要独立地更新每一个模块.
  • 代码/数据 的授权共享 – Android 提供模式匹配的权限控制机制,因此一个应用可以暴露功能给另一个用指定证书签名的应用. 通过用相同证书签名多个应用,以及使用模式匹配的权限检查,应用程序可以以安全的方式共享代码和数据.
  • 另一个影响签名策略的重要考量是, 如何设置签名应用的key的有效期.

如果计划为某个单独的应用程序提供更新支持, 那么应该确认key的有效期要比应用的寿命长. 推荐25年或者更长的有效期.当key的有效期过期, 用户将再也不能无缝地更新到应用程序的新版本.

如果要使用相同的key为多个不同的应用签名, 应当确认key的有效期比所有这些应用的所有版本的生命周期还长,包括要比将来加到这个套件中的额外的关联应用的生命周期更长.

如果计划将应用程序发布到Android Market, 为应用签名的key的有效期必须在2033年10月22日以后.Market服务器强制执行这个规则, 来保证当新版本可用时, 用户可以无缝地更新Market应用.

当设计的时候, 须牢记这些要点, 以确保使用合适的证书来签名应用程序。

 

二、给Apk签名:

 

(1) Android的签名文件存放于系统源码的 build/target/product/security/目录下

    

    该目录下有 media.pk8、media.x509.pem、platform.pk8、platform.x509.pem、shared.pk8、shared.x509.pem、testkey.pk8、testkey.x509.pem等签名文件,不同的签名文件,对应不同的权限。Android默认的签名文件为testkey.pk8、testkey.x509.pem。

 

(2) Android自带的签名工具为 signapk.jar, 可以在源码编译目录out中找到,具体路径为:out/host/linux-x86/framework/signapk.jar    以上APK具有系统权限,重新签名应该使用platform签名文件进行签名。

 

    签名方法:将对应权限的签名文件platform.pk8、platform.x509.pem, 签名工具 signapk.jar, 以及需要签名的apk(假设 old.apk) 放到同一目录下,打开linux终端(windows cmd也可以),进入该目录,进行重新签名:

 

    java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk

 

    重新生成的new.apk就可以安装在我们的Android设备上了。

 

关于系统签名出现如下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.conscrypt.NativeCrypto.get_cipher_names(Ljava/lang/String;)[Ljava/lang/String;

at org.conscrypt.NativeCrypto.get_cipher_names(Native Method)

at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:764)

at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:56)

at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:49)

at com.android.signapk.SignApk.main(SignApk.java:942)

加上启动参数 -Djava.library.path,链接相应的库, -Djava.library.path=out/host/linux-x86/lib64(路径可以是相对路径)

 

例如:java -Djava.library.path=../lib64 -jar signapk.jar shared.x509.pem shared.pk8 GoogleServicesFramework.apk GoogleServicesFramework1.apk

<think>好的,用户的问题是关于如何利用AOSP源码通过platform key对app进行重新签名。我需要先理解用户的需求背景。用户提到之前的问题是关于给Android Studio编译的APK添加系统签名,现在想了解如何用AOSP的源码platform key重新签名应用。可能用户是Android开发者,需要让自己的应用拥有系统权限,比如访问某些受保护的API或组件。 首先,我需要回忆AOSP的签名机制。系统应用通常使用platform签名,而第三方应用如果想获得系统权限,也需要使用相同的签名。AOSP源码中应该有相关的密钥签名工具,比如signapk.jar或者使用Android.mk中的配置。 接下来,步骤可能包括:准备platform密钥,通常位于AOSP源码的build/target/product/security目录下;配置应用的Android.mk或Android.bp文件,指定签名类型为platform;或者使用手动签名的方式,比如使用signapk工具。 需要确认用户是否已经有AOSP的源码环境,因为可能需要编译环境中的工具。如果没有,可能需要指导用户如何获取配置这些工具,比如signapk.jarplatform.pk8、platform.x509.pem文件。 另外,用户可能需要了解如何将应用添加到系统镜像中,或者直接对已有的APK进行重新签名。这时候可能需要分步骤说明,比如自动签名通过编译系统,或者手动签名使用命令行工具。 还要注意引用之前的参考资料,比如用户提到的引用[1]引用[2],可能需要将步骤中的关键点与这些引用关联起来,比如制作系统签名文件的部分,或者赋予第三方应用系统权限的方法。 可能存在的一些问题:用户可能不清楚如何获取platform key,或者如何配置编译脚本。需要详细说明每个步骤,包括文件的路径、命令的参数等。同时,需要提醒用户关于权限的问题,比如只有系统应用才能使用某些权限,签名后可能需要将应用放到/system/priv-app目录下。 此外,是否需要生成相关问题?根据用户提供的示例,需要生成三个相关问题。可能的问题包括如何生成platform key签名后的权限提升方法,或者如何处理签名失败的情况。 最后,要确保回答结构清晰,分步骤说明自动签名手动签名的方法,并验证签名是否成功。同时,检查是否所有LaTeX格式都正确,数学公式用$...$,独立公式用$$...$$,但在这个问题中可能用不上太多数学公式,主要关注代码命令行示例。</think>### 利用AOSP源码通过Platform Key对App重新签名 要为应用赋予系统级权限(如访问`signature|privileged`级别的API),需使用AOSP的`platform key`对APK进行签名。以下是两种实现方式: --- #### 方法1:通过AOSP编译系统自动签名(推荐) **步骤1:将应用源码放入AOSP目录** 将应用代码置于`AOSP/packages/apps/YourApp/`目录下,确保包含标准的Android应用结构(如`AndroidManifest.xml`、`src/`、`res/`)。 **步骤2:配置签名类型** 在`Android.mk`或`Android.bp`文件中声明使用`platform`签名: ```makefile # Android.mk示例 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PACKAGE_NAME := YourApp LOCAL_CERTIFICATE := platform # 关键:指定使用platform签名 LOCAL_PRIVILEGED_MODULE := true # 可选:声明为特权应用 include $(BUILD_PACKAGE) ``` **步骤3:编译并集成到系统镜像** 执行以下命令编译应用并生成系统镜像: ```bash source build/envsetup.sh lunch <target_device>-userdebug # 选择目标设备 make YourApp # 单独编译应用 make snod # 重新生成system.img ``` 编译后,应用会被自动签名并打包到`system/priv-app/YourApp/`目录[^1]。 --- #### 方法2:手动签名现有APK **步骤1:获取Platform Key文件** 从AOSP源码中提取密钥文件: - `platform.x509.pem`(证书) - `platform.pk8`(私钥) 路径通常为:`AOSP/build/target/product/security/` **步骤2:使用signapk工具签名** 通过AOSP编译生成的`signapk.jar`工具执行签名(位于`out/host/linux-x86/framework/`): ```bash java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output-signed.apk ``` **步骤3:验证签名信息** 使用`apksigner`检查签名是否成功: ```bash apksigner verify --print-certs output-signed.apk ``` 输出应包含`CN=Android, OU=Android`,表明使用了platform签名[^2]。 --- #### 关键配置说明 1. **特权应用声明** 在`AndroidManifest.xml`中添加: ```xml <manifest ... android:sharedUserId="android.uid.system"> ``` 2. **系统分区部署** 签名后的APK需放入`/system/priv-app/YourApp/`目录,否则权限可能不生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你好,工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值