这几天更新APK 从版本v1.2升级到版本v1.3.遇到的签名冲突问题.在这里做一个记录.
问题重现
- APK_A:目前平台上玩家的版本v1.2 拥有平台签名 key_A;(md5算法)
- APK_B:我方(开发商)提供的新版本v1.3 给平台方签名,拥有我方签名 key_B;(RSA,SHA1,MD5)
- APK_C:平台方签名后返回的新版v1.3已签名包,拥有平台签名 key_A;
A,B,C三个APK中 按照逻辑上将 A,C是应该拥有共同的签名key_A的,所以可以正常升级不会出现签名冲突;
但是事情就是这样发生了,当我安装APK_A之后安装APK_C 提示签名冲突;
原因分析
- 平台方两次的签名key_A 被篡改;
- 平台方两次签名工具差异导致的签名不成功(包括版本差异);
- 平台方签名命令行两次发生变化,例如新增了某算法验证;
- 平台方未去除干净key,就签名,等于是二次签名
- 我方提供的签名key_B 对key_A产生影响;
但是经过手动验证后1,2,3,5都可否决
那就只剩下4,但是鉴于之前的更新都正常 所以4一开始是被我认为最不可能的.
但是后来发现确实是4造成的.
根本原因在于:平台方在未去签名的情况下进行签名;等于在APK在拥有key_A的情况下直接签key_B;
签名后的APK_C还保留有APK_B的某类签名信息.所以导致了签名冲突;
解决方式
- 我方提供的时候每次都对自己的APK签名进行破坏.或者直接不签名,这个基本不可能,因为未签名的APK是不允许安装到设备上的,没签名就给平台方 请问怎么测试怎么保证版本完整性呢;
- 平台方优化签名流程,在签名之前加一步去APK签名,变成 [去除签名]-[签名]-[优化]-[发包]的完整流程;
其实就是两步都可以概括为一步.就是在对APK签名之前 先完全去除老签名;