参考文章
故事背景
首先这个需求是因为客户安全部门对我们的apk进行安全测试,发现我们apk的证书签名信息是不规范的,需要我们去修改证书里面的信息,于是乎,我们开始了修改写bug之路.
目标
实现android apk 证书签名的信息替换
方式
- 1
首先我们需要按照修改思路的方式去尝试,这里我们引入csdn的文章,其中核心思路就是通过keytool 命令:
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,这里不再赘述,自行百度.
- 2
在使用命令进行修改成我们想要的信息后,我们发现,证书的SHA1和SHA256的值改变了,那么,这同时也意味着证书的密钥对发生了改变,那这样就会引发一个问题,用户在使用我们新签名的Apk时候,会安装失败,也就是即便我们去升级Apk这个功能失效.用户想使用新的APK的时候,只能卸载老的APK,无法使用新的APK,这无疑对用户体验来说,是极其的差,那么,我们应该怎么办呢,于是有了下面的研究方法. - 3
咨询谷歌爸爸,没发,谷歌是android的爸爸,有困难,找爸爸,于是,我们翻找google开发者文档,发现了有关V3签名(事实上,V4已经出来了,但是官网没有放出来),什么是V3签名, 如下:
Android 9 支持 APK 密钥轮替,这使应用能够在 APK 更新过程中更改其签名密钥。为了实现轮替,APK 必须指示新旧签名密钥之间的信任级别。为了支持密钥轮替,我们将 APK 签名方案从 v2 更新为 v3,以允许使用新旧密钥。v3 在 APK 签名分块中添加了有关受支持的 SDK 版本和 proof-of-rotation 结构的信息。总的来说,他是将新的证书打入老的证书中,这样如果设备支持V3,那么就是会使用V3签名,如果不支持,那么还是使用老的签名,那么不如试试? - 4
首先,我们需要准备一个老的签名的jks,我们称之为old.jks 已经用老签名过的包,我们称之为old.apk,然后新的签名文件,我们称之为new.jks, ok 准备工作就绪,核心脚本命令如下
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爸爸留给我们的惊喜,不知道能不能彻底解决证书替换的问题.
网友评论