大家好,又见面了,我是你们的朋友全栈君。
Android 11系统签名以及keystore
一、什么是系统签名
Android系统中,所有的APP都需要签名,来保证报名在设备上是唯一的,避免相同包名应用被覆盖;系统签名意味着对于将这个APP视为系统APP,具有更高的权限,比如可以开机自启动,从后台启动activity等。
同时需要在AndroidManifest中指定sharedUserId
android:sharedUserId="android.uid.system"
sharedUserId的作用:同一ID下的应用可以共享数据,也可以运行在同一进程。
二、使用signapk.jar签名
2.1 找到对应文件
(1) 在根目录下创建keystore文件夹以方便工作
(2)查找密钥和证书
build/target/product/security/platform.x509.pem
build/target/product/security/platform.pk8prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so
out/host/linux-x86/framework/signapk.jar
把上述文件移到同一个文件夹,比如(1)中创建的文件夹keystore中
(3)android studio生成没有签名的apk文件
点击:Build->Build Bundle(s)/APK(s)->Build APK(s)
并将project的工程目录的app/build/intermediates/apk/debug/app-debug.apk拷贝到keystore目录下
(4)运行以下命令
java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app.apk app_sign.apk
三、生成keystore以供客户使用
上述方式,需要我们将SDK和秘钥都给到客户,这种方式不但不安全,而且使用起来不方便,需要客户有linux环境。
并且下述这种方式可以直接在Android Studio下使用,所以推荐使用以下方式。
3.1 找到对应密钥文件
build/target/product/security/platform.x509.pem
build/target/product/security/platform.pk8
3.2 生成密钥脚本
执行之前,先确保有安装openssl,并soure build/envsetup.sh和lunch
#!/bin/bash
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -password pass:pass:pkcs12passwd -name androidentry
keytool -importkeystore -deststorepass password1 -destkeypass password2 -destkeystore shared.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass pkcs12passwd -alias androidentry
3.3 对于生成密钥过程中的解释
(1)将DER格式转换为PEM格式的证书,这一步不需要输入密码
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
这一步作用:将DER格式转换为PEM格式的秘钥
nocrypt:不加密,直接转换
inform:输入格式
outform:输出格式
in:输入证书
out:输出证书
(2)生成pkcs12格式的证书
注:-password 要和后面的srcstorepass一致
-name 要和后面的-alias一致
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -password pass:pkcs12passwd -name androidentry
这一步作用:将platform.x509.pem 用shared.priv.pem和加密,获得shared.pk12 ,在其内创建秘钥入口并加上密码
name:秘钥的入口名
password:秘钥加密的密码
inkey:给证书加密的秘钥
in:输入的证书
(3)生成keystore
keytool -importkeystore -deststorepass password1 -destkeypass password2 -destkeystore shared.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass pkcs12passwrd -alias androidentry
**这一步作用:使用密码解锁秘钥,并使用key store密码和key密码对shared.pk12进行入口加密,生成keystore **
importkeystore:生成秘钥
deststorepass:指定key store密码
destkeypass:指定key 密码
srckeystore:指定源秘钥
destkeystore:目标秘钥
srcstoretype:源秘钥类型
srcstorepass:源秘钥入口密码
alias:源秘钥入口
(4)keystore包含的内容
最终shared.keystore里面包含了一个入口androidentry,需要用key store密码和key密码进行访问,访问成功,就可以用里面的platform.x509.pem对自己的APP进行加密。
四、AndroidStudio下使用
待更新,百度有很多
五、检测方法
没有系统签名的APK在使用了shardUserId为android.uid.system的时候是无法安装的,所以直接安装就可以知道。
实在不放心,可以用ps -A | grep xxx.xxx.xxx
查看,xxx.xxx.xxx为你的app包名,如果看到使用者是system就说明是系统签名应用。
六、已知问题
在ubuntu22.04下使用keytool生成keystore是会失败的,提示keystore password was incorrect
。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152006.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...