一 背景
想到要修改这个问题 是因为收到下面整改通知 要求我们更新签名文件的签名算法,看到这个问题都懵了呀 虽然打包天天用签名文件 但是从来没关注过他呀
开发者自查: 不要使用已经过时或不安全的弱算法,确保签名证书使用了更强的签名算法, 如 SHA-2(其中包括 SHA-256 和 SHA-512)。
然后就想着查看下签名信息:
首先 查看签名信息有三种方法,
第一种使用JDK的keytool -printcert -jarfile apk
第二种 使用Android sdk build-tool 下的 apksigner 的apksigner verify -v --print-cert apk
第三种 使用jarsigner 暂时不考虑这种。
先用keytool -printcert -jarfile apk查看,还真是
再用apksigner 的apksigner verify -v --print-cert apk查看自己的apk
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): falseVerified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: *****
Signer #1 certificate SHA-256 digest: 123
Signer #1 certificate SHA-1 digest: 456
Signer #1 certificate MD5 digest: 789
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024Signer #1 public key SHA-256 digest: 111
Signer #1 public key SHA-1 digest: 222
Signer #1 public key MD5 digest: 333
这个没有显示具体的签名算法名称,只显示了密钥算法的位数1024和类型RSA
二 :怎么办
咋办呢?第一反应是要新建一个签名文件 但是如果新建文件 那存量的APP 就没办法 升级了呀 ! 很严重~
so 开始百度
查到Android9.0以后可以采用密钥轮替的方法更新签名信息,具体可以参考
Android使用apksigner轮转签名的小整理 - 简书
好的 那测试就开始啦
实战
1.具体的位置和准备工作
需要两个签名文件 一个旧的 一个新的 一个apk
1:密钥轮替需要两个签名文件 为了保证不影响升级,那么先创建一个新的签名 文件
keytool -genkey -v -sigalg SHA256withRSA -keysize 2048 -alias your_alias -keystore your_keystore_name -validity 36500
然后开始准备轮替 :
2: 工具的存放位置(apksigner在哪里):
apksigner是Google官方提供的针对Android apk签名及验证的专用工具,
位于Android SDK/build-tools/SDK版本/apksigner.bat
我们进选一个大于28的版本进去就可以了
D:\Sdk\build-tools\29.0.0-rc2>apksigner rotate --out /path --old-signer --ks release.jks --new-signer --ks release2.jks
Keystore password for old signer:
Keystore password for new signer:
D:\Sdk\build-tools\29.0.0-rc2>
输入release.jks的密码,输入release2.jks的密码然后就导出了path文件,这个path文件是一个什么呢??其实就是一个二进制的文件。
但是就是找不到path的路径,其实path文件的位置是在D:\
,就在我电脑的D盘根目录
下面开始签名:
D:\Sdk\build-tools\29.0.0-rc2>apksigner sign --ks release.jks --next-signer --ks release2.jks --lineage /path release.apk
Keystore password for signer #1:
Keystore password for signer #2:
D:\Sdk\build-tools\29.0.0-rc2>
签完名 以后 我们放进去的apk 就会重新被签名 老规矩 再用上面的两种方式 验证
第一种
先用keytool -printcert -jarfile apk查看,还是这样显示的 这是没成功吗?留个疑问
第二种:发现 key size 已经成功变成2048 了 并且 成功v3的签名方式也从false 变成了 true 说明轮替成功了 但是 因为上面的签名算法没有显示 啊 那到底有没有轮替成功呢
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): trueVerified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: ****
Signer #1 certificate SHA-256 digest: 6
Signer #1 certificate SHA-1 digest: 5
Signer #1 certificate MD5 digest: 4
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 3
Signer #1 public key SHA-1 digest: 2
Signer #1 public key MD5 digest:1
好 我们来开始验证
1:使用签名轮替后的使用的是新的签名算法还是旧的呢 为啥keytool获取的签名信息为啥没有改变呢
我是怎么验证的呢 ?上面截图中是通过apksigner 签名后的apk 的签名信息 虽然没有签名算法 但是那些蓝色的信息也是通过sha256 或者 sha1 算法 以后的得到的数据啊,那我只要验证单独用新签名文件签名的apk 跟 我用密钥轮替 后的apk的信息一致 是不是就可以证明 我轮替后的签名算法是用的新的了呢 ?
所以 我用上面新的签名文件 通过命令 单独去给一个apk签名 得到如下信息
签名命令:
apksigner sign --ks 新签名文件名字.jks 7.apk
首先 keytool 查看用新的签名文件单独签名的apk 的签名信息,证明新的签名签名算法是sha256 密钥长度也是2048 至少是符合规则的哈
其次 使用 查看apk的签名信息
apksigner verify -v --print-cert apk
得到的签名信息 跟轮替签名的 apk的签名信息一模一样 那么证明 我们用的就是新的签名算法
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): trueVerified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: ****
Signer #1 certificate SHA-256 digest: 6
Signer #1 certificate SHA-1 digest: 5
Signer #1 certificate MD5 digest: 4
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 3
Signer #1 public key SHA-1 digest: 2
Signer #1 public key MD5 digest:1
然后 在手机里面安装一个旧的 apk 运行起来
再安装一个密钥轮替后的 apk (版本高一点哈),发现可以正常安装 ,说明升级也没问题
so 成功啦
ps 理解的不深 也不知道对不对 有问题留言哈~
另: 查资料的时候 还了解到 一个 双重签名 说是可以兼容新旧版本 但是试了以后 不行哦 估计最开始就用双重签名可以吧 反正 如果从一个单一签名的apk 升级到 一个双重签名的apk上 会提示签名冲突。