‘壹’ PHP获取安卓apk包里的apk签名
所需工具:aapt,android SDK中的工具,只有一个exe,可以直接运行。
keytool,JDK中的工具,需要安装JDK环境。
需要提供目标应用的apk
1、获取包名
例如:aapt.exe mp badging C:\Users\Administrator\Desktop\demo-apk-1.0.1.8791.apk > C:\Users\Administrator\Desktop\1.txt
获取到的包名是com.pakgname.swbg
2、获取签名
SHA1: 56:BD:02:6B:9D:53:D7:F5:32:B2:BC:BD:BB:34:5B:F1:CD:EF:7F:C0
这里借助github开源的类apkparser
在项目composer.json中执行下面命令或修改composer.json引入即可
方法二适用于没有java环境的情况下,一般linux都会有openssl环境。
原理:通过分析方法一中,发现apk包解压之后,里面会有.rsa签名证书,此证书是一个符合pki体系的x509证书,通过openssl命令即可查看信息。
‘贰’ Android Studio 之签名
通过签名可以确保数据来源的可靠性和数据的不可篡改性
对 Apk 进行签名,也就是在 Apk 中写入一个指纹,写入指纹后,Apk 中有任何修改,都会导致这个指纹无效,Android 系统在安装 Apk 进行签名校验时就会不通过,进而无法安装该 Apk
如上图:
通常的签名验签过程中,接收方收到消息后,会先向 CA 机构验证证书的合法性,再进行签名校验。但 Apk 的证书通常由开发者自己制作,没有向 CA 机构申请,Android 系统在安装 Apk 时也并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,因此,如果对第三方 Apk 重新签名,也能安装到没有安装过这个 Apk 的系统中
keystore 文件包含私钥、公钥和数字证书,分为很多种,Android 使用的是 Java 标准 keystore 格式 JKS(Java Key Storage)
Android App Bundle:用于通过 Google Play 发布的应用,需要升级到AS 3.2 以上版本才支持App Bundle 格式;
APK:用于创建可部署到设备上的签名 APK
点击 Finish 就会生成签名文件与签名后的 Apk
当我们需要升级 Apk 版本的时候,需要再次对 Apk 文件进行签名,可以通过配置 build.gradle 让其自动生成签名后的 Apk
如果你的项目是开源的,需要把你的签名信息写在 local.properties 中,然后在 .gitignore 配置文件中加入 local.properties ,这样 local.properties 就不会提交到开源项目中,签名信息也就不会被人获取
local.properties:
app/build.gradle:
有时候我们的 apk 中某些功能需要系统签名,例如静默安装。测试系统签名的 apk,需要 root 权限,而带 Google APIs 的模拟器不能 root,因此要注意不能选择带 Google APIs 的模拟器
下面执行的操作都是在 Linux 中,如果 apk 是 window 中生成的,需要拷贝到 linux 操作,再将生成的系统签名过得 apk 再拷贝到 window,比较麻烦,可以考虑后面的自动系统签名,还是需要在 linux 操作一次,不过之后就可以只在 window 操作了
这两个文件在目录 aosp/build/target/proct/security 下,如下图
在目录 aosp/prebuilts/sdk/tools/lib 下,如下图
将前面获取的 platform.pk8 、 platform.x509.pem 和 signapk.jar 文件放到需要签名的 apk 同一个目录,执行以下命令
如果出现上面的错误:Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]
解决方法:
到目录 aosp/prebuilts/sdk/tools/linux/lib64 下,复制 libconscrypt_openjdk_jni.so 文件到需要签名 apk 的同一个目录,并将命令改为
自动进行系统签名的原理是:先生成一个 system.jks 文件,使用 keytool-importkeypair 对 system.jks 文件进行系统签名,再 build.gradle 和 local.properties 进行配置,直接使用带有系统签名的 system.jks 对 apk 进行签名,这样编译生成的apk文件就自带系统签名了
按照前面的方法,生成一个 system.jks 文件,此时是在 window 系统中操作的
进入 keytool-importkeypair 目录,将 system.jks、platform.pk8、platform.x509.pem 文件拷贝进来,拷贝之后的目录结构为
使用 linux 中修改过的带有系统签名的 system.jks 文件将 window 中最开始生成的 system.jks 覆盖掉,再像前面的自动签名部分一样,修改 build.gradle 和 local.properties 的配置,之后生成的 apk 就是系统签名过的了
测试方法是,在 AndroidManifest.xml 中添加 android:sharedUserId="android.uid.system" 后安装到 非 Google APIs 的模拟器上 , Google APIs 的模拟器不能 root,无法安装
会发现只有使用 system.jks 文件签名后才能安装,否则安装失败,会报以下的错误:
‘叁’ 如何利用jks文件给apk签名
jarsigner -verbose -keystore xxx.jks -signedjar xxx.apk(签名后的apk名字) xxx.apk(需要签名的apk) xxx(keystore别名)
以linux下为例:
进入android sdk下的platform-tools:输入如下指令
jarsigner -verbose -keystore /cloud/xxx.jks -signedjar /cloud/app.apk( /cloud/app-unsigned.apk xxx
然后输入密码,即可签名成功。
‘肆’ 如何为apk以及zip文件签名
如果你只是想知道如何签名及下载签名工具,请直接看“如何使用SignApk.jar来为一个apk或zip文件签名”部分。要创建自己的证书请从头看起。
准备知识:
当你要发布一个软件或是自制的ROM时,你就需要一个使用了私钥的证书来为.apk或.zip文件进行签名。Android系统使用证书来识别软件作者和软件之间所建立的认证关系。做这个事情最经典的方式就是用keytool创建证书,然后使用jarsigner进行签名。但是本教程则会提供一个对于大多数人来说更为容易的方法,那就是使用一个名为SignApk.jar的工具。
SignApk.jar是一个已包含在Android平台源码包中的工具,你可以在本贴的附件中下载。如果要使用SignApk.jar,你需要创建一个带有对应证书/公钥的私钥。而你可以使用Openssl来创建私钥/公钥对。在Unix/Linux系统中使用Openssl相对来说比较容易。对于Windows用户,你可以在本贴附件或此链接中下载Windows版本的Openssl。
如何使用OpenSSL创建私钥/公钥对(也就通常说的证书文件,有误勿怪)(Windows版本)
下载附件中的openssl-0.9.8k_WIN32.zip
将下载到的压缩包解压到你电脑上的任意位置(例如:C:\OpenSSL)
在OpenSSL\bin文件夹下按顺序输入(使用CMD命令行工具,其中第2步会需要你输入一些信息,见图):
1、openssl genrsa -out key.pem 1024
2、openssl req -new -key key.pem -config C:\OpenSSL\openssl.cnf -out request.pem
3、openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
4、openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
大星星提示:如果你的recovery不具备签名校验切换功能,那么用你自己生成的证书文件来给ROM签名,会提示签名校验失败。因为目前几乎所有的第三方recovery中所带的私钥都是testkey的。(附件中的android.zip里面所包含的证书文件已更新为testkey)
如何使用SignApk.jar来为一个apk或zip文件签名:
下载附件中的android.zip
将下载到的压缩包解压到你电脑上的任意位置(例如:C:\android)
如果你的电脑上还没有安装JAVA环境,请下载并进行安装。
(如果你创建了自己的私钥/公钥对)复制certificate.pem和key.pk8到你解压得到的android文件夹中
使用CMD命令行工具cd到android文件夹,然后输入:(对于我提供的包,只需要将要签名的文件放在android文件夹中,然后拖至对应的批处理文件上即可)
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk
或是
java -jar signapk.jar certificate.pem key.pk8 your-update.zip your-signed-update.zip