一、应用使用系统签名

假设我们得到了系统签名文件:platform.pk8、platform.x509.pem,还需要一个用于签名的文件:signapk.jar,这里提供了一份下载连接,可供练习使用:链接:https://pan.baidu.com/s/1OiBcVyhZVqTulb6HXwcqHA 提取码:7g81

有时候我们找系统提供商要系统签名时,可能给的文件很多,如下:

android 系统签名文件在哪里_Android系统签名


其实真正只需要用到platform.pk8、platform.x509.pem即可。

不同的系统,系统签名是不一样的,所以你们下载我的这个签名文件是用不到你的系统上的,但是signapk.jar是通用的,什么系统签名都可以使用他。

当你有你的系统签名文件时,如何把一个apk签名为系统签名呢?如下:

  1. 把platform.pk8、platform.x509.pem、signapk.jar、app.apk放到同一个目录下
  2. CMD进入到上面的目录中,然后输入如下命令:
java -jar signapk.jar platform.x509.pem platform.pk8 app.apk app_signed.apk

注:这里app.apk就是你的App,此App不论是有签名还是没签名都是可以的,通过上面的命名后,签名就会变成系统的签名了。

注:一个应用要想使用系统签名,还需要在清单文件中设置一个属性,如下:

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system">

我们使用adb命令安装一个没有签名的apk

adb install unsigned.apk

此时会报错,如下:

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

INSTALL_PARSE_FAILED_NO_CERTIFICATES翻译过来就是:安装解析失败,没有证书(签名)

使用adb命令安装一个有系统签名的apk,但是安装到一个不匹配的android系统上,会报错如下:

Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]

INSTALL_FAILED_SHARED_USER_INCOMPATIBLE翻译过来就是:安装失败,共享用户不兼容(其实说的就是系统签名与所安装的手机不兼容)

二、把系统签名弄成jks签名文件

1、把platform.pk8、platform.x509.pem放在同一个目录下,然后cmd中进入这个目录。
2、生成platform.pem,输入如下命令:

openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

如果提示没有openssl命令,则需要先安装openssl,下载地址:http://slproweb.com/products/Win32OpenSSL.html,一般我们下载64位的exe,且容量大的那个,如下:

android 系统签名文件在哪里_platform.pk8_02


预防下载连接失效,这里也提供一个百度网盘下载:链接:https://pan.baidu.com/s/1gFpPMwfwCTpty7xCdiEZ2A 提取码:1234

安装后之后,把安装目录下的bin目录设置到path环境变量中即中。

3、生成platform.p12,命令如下:

openssl pkcs12 -export -in  platform.x509.pem -out platform.p12 -inkey  platform.pem -password pass:123456 -name key0

注:这里的123456为密码,key0为别名,可以自行设置。
4、生成platform.jks,命令如下:

keytool -importkeystore -deststorepass 123456 -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 123456

注:这里有两个123456,都是密码,与前一步设置的密码保持一致。

这一步,会报出一个警告,如下:

Warning:
JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore ./platform.jks -destkeystore ./platform.jks -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。

可以忽略它,也可以按它说的输入那个命令:

keytool -importkeystore -srckeystore ./platform.jks -destkeystore ./platform.jks -deststoretype pkcs12

到这里,我们就有了一个platform.jks的系统签名文件了,以后打包apk就像平常那样打包即可,可以把debug的签名也设置为这个,这样在AndroidStudio中可以直接运行apk来调试。

三、相同签名文件生成的jks文件是相同的

同一份系统签名(即platform.pk8、platform.x509.pem)生成的jks文件,假设在A用户的电脑生成一个,在B用户的电脑生成一个,如果比较这两个jks文件的md5会发现是不一样,但它里面的签名的md5却是一样的,这是因为jks文件其实相当于是一个容器,把签名文件放到容器里面而已,就像保险箱,每个容器可以有自己不同的密码和alias名称,但是它里面的签名是一样的,今天厂家发给了我platform.pk8、platform.x509.pem文件,我自己生成了一个jks,厂家也生成了一个jks,我通过命令查看签名发现是一样的。

今天使用系统签名生成jks文件时,有一个警告提示,如下:

Warning:
<key0> 使用的 MD5withRSA 签名算法被视为存在安全风险而且被禁用。

有可能是因为这个签名文件你可以用,别人也可以用,不是独有的,所以提示风险。