2022-06-24 关于android的签名jks的替换尝试.

2022-06-24  本文已影响0人  仲夏之雪梦旅人

参考文章

android developer 开发者
掘金博客

故事背景

首先这个需求是因为客户安全部门对我们的apk进行安全测试,发现我们apk的证书签名信息是不规范的,需要我们去修改证书里面的信息,于是乎,我们开始了修改写bug之路.

目标

实现android apk 证书签名的信息替换

方式

keytool -selfcert -alias myalias -keypass aliaspassword -keystore my.jks -storepass jkspassword -dname "CN=FirstAndLastName1, OU=OrganizationalUnit1, O=Organization1, L=CityOrLocality1, ST=StateOrProvince1, C=CountryCode1, EMAILADDRESS=email1@gmail.com" 

至于什么是keytool,这里不再赘述,自行百度.

apksigner rotate --out lineage --old-signer --ks-key-alias ${KEY_ALIAS_OLD} --ks-pass pass:${KEYSTORE_PASSWORD_OLD} --key-pass pass:${KEY_PASSWORD_OLD} --ks old.jks  --new-signer --ks-key-alias ${KEY_ALIAS_NEW} --ks-pass pass:${KEYSTORE_PASSWORD_NEW}--key-pass pass:${KEY_PASSWORD_NEW} --ks new.jks

这里需要注意的是你们需要替换的内容是KEY_ALIAS_OLD=“老的jks的别名”,KEYSTORE_PASSWORD_OLD=”老的jks的库密码“,KEY_PASSWORD_OLD = “老的jks的别名密码”
剩下的也是依次替换就行了,然后会在你所在执行命令的目录下,生成一个lineage文件,这个文件非常重要
,相当于轮替文件的内容,下面我们在执行这个命令脚本

apksigner sign --ks-key-alias ${KEY_ALIAS_OLD}  --ks-pass pass:${KEYSTORE_PASSWORD_OLD} --key-pass pass:${KEY_PASSWORD_OLD} --ks old.jks --next-signer --ks-key-alias  ${KEY_ALIAS_NEW} --ks-pass pass:${KEYSTORE_PASSWORD_NEW} --key-pass pass:${KEY_PASSWORD_NEW} --ks new.jks --lineage ${LINEAGE} --out ${OUT_FILE}.apk --in old.apk

这里需要注意的是这两个占位符号LINEAGE = “lineage的文件路径” ,OUT_FILE="新生成的apk的路径",
这样你就会得到签名后的apk,在执行apksigner verify --verbose 命令 ,你就能看到是否开启V3


image.png

这样能看到,V3开启,还有V4的彩蛋,当然,V4,在官网还没有更新出文档.
所以我们就可以把这个apk当成我们签名过度的apk,我们称之为transition.apk,那我们后续升级的安排,就可以是 old.apk->transition.apk->直接使用新的签名的apk,从而,完成apk的签名更新,

问题

这个流程虽然可以解决签名替换的问题,但是,问题是,这个只在大于等于android9的机型上才会生效,经过测试,我自身的android 11 手机是可以的,android 9以下的手机还未测试,等待我后续更新,根据掘金的博主和google爸爸的描述中可以得出,只有在支持V3的手机上才会生效,而且,应用上架除非应用市场将其检验方式换成V3的应该就可以了,可是并非所有版本的Android系统都可以直接覆盖安装,所以就算是安全上架了,系统版本低的还是要卸载才能安装。所以,看的出来V3在解决这个问题,那么V4呢,这个google爸爸留给我们的惊喜,不知道能不能彻底解决证书替换的问题.

上一篇 下一篇

猜你喜欢

热点阅读