Android 升级签名算法从SHA1withRSA 升级到SHA256withRSA

一 背景

想到要修改这个问题 是因为收到下面整改通知 要求我们更新签名文件的签名算法,看到这个问题都懵了呀 虽然打包天天用签名文件 但是从来没关注过他呀

开发者自查: 不要使用已经过时或不安全的弱算法,确保签名证书使用了更强的签名算法, 如 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): false
Verified 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): 1024

Signer #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轮转签名的小整理 - 简书

Android 升级签名算法从SHA1withRSA 升级到SHA256withRSA_第1张图片

Android 升级签名算法从SHA1withRSA 升级到SHA256withRSA_第2张图片

好的 那测试就开始啦

实战

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

Android 升级签名算法从SHA1withRSA 升级到SHA256withRSA_第3张图片

我们进选一个大于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): true
Verified 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): true
Verified 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上 会提示签名冲突。 

你可能感兴趣的:(android)