Android使用apksigner轮转签名的小整理

前言

这篇文章主要是分析apksigner rotate,从字面意思理解,这是签名轮转。但是我们不讲原理,我们直接旋转,签名。
我们先贴两个链接,如果一看就明白就不用往后看了。

1.具有密钥轮转的 APK 签名方案
相应的图如下:

轮转签名

2.apksigner 的使用
相应的图如下:
命令执行

分析和实战

1.具体的位置和准备工作

工具的存放位置(apksigner在哪里):
apksigner是Google官方提供的针对Android apk签名及验证的专用工具,
位于Android SDK/build-tools/SDK版本/apksigner.bat

如下图:
位置

点开文件夹就能够看到apksigner.bat。但是要注意25及以上的版本才有。
还有我的文件夹下面有一个特殊的名字:29.0.0-rc2文件夹,这篇文章我们所有的操作就是在这个文件夹下面进行的。

我们来一张详情图:

内部详情

文件夹里面的release.apk,release.jks,release2.jks这三个文件是拷贝到里面的。就是我们需要的apk和签名。

2.1 apksigner的基本使用:

打开命令行进入D:\Sdk\build-tools\29.0.0-rc2输入apksigner,得到下面的结果:

D:\Sdk\build-tools\29.0.0-rc2>apksigner
USAGE: apksigner <command> [options]
       apksigner --version
       apksigner --help

EXAMPLE:
       apksigner sign --ks release.jks app.apk
       apksigner verify --verbose app.apk

apksigner is a tool for signing Android APK files and for checking whether
signatures of APK files will verify on Android devices.


        COMMANDS
rotate                Add a new signing certificate to the SigningCertificateLineage

sign                  Sign the provided APK

verify                Check whether the provided APK is expected to verify on
                      Android

lineage               Modify the capabilities of one or more signers in an existing
                      SigningCertificateLineage

version               Show this tool's version number and exit

help                  Show this usage page and exit

在其他的文件夹下面运行上面的命令得到的结果是不同的。比如:

D:\Sdk\build-tools\28.0.0>apksigner
USAGE: apksigner <command> [options]
       apksigner --version
       apksigner --help

EXAMPLE:
       apksigner sign --ks release.jks app.apk
       apksigner verify --verbose app.apk

apksigner is a tool for signing Android APK files and for checking whether
signatures of APK files will verify on Android devices.


        COMMANDS

sign                  Sign the provided APK

verify                Check whether the provided APK is expected to verify on
                      Android

version               Show this tool's version number and exit

help                  Show this usage page and exit
2.1.1 verify的使用:
 apksigner verify -v --print-certs xxx.apk

参数:
    -v, --verbose 显示详情(显示是否使用V1,V2,V3签名)
    --print-certs 显示签名证书信息

详细的结果如下:

D:\Sdk\build-tools\29.0.0-rc2>apksigner verify -v --print-certs   release.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): false
Number of signers: 1
Signer #1 certificate DN: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
Signer #1 certificate SHA-256 digest: c8a2e9bccf597c2fb6dc66bee293fc13f2fc47ec77bc6b2b0d52c11f51192ab8
Signer #1 certificate SHA-1 digest: 27196e386b875e76adf700e7ea84e4c6eee33dfa
Signer #1 certificate MD5 digest: 8ddb342f2da5408402d7568af21e29f9
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 3d3df7dc9bf26e02d4cd76256d41d45e41a4dedebe7feb95c40e3697681be8a7
Signer #1 public key SHA-1 digest: 06cac910fdbd67398c0bb8e297ef679dea589f61
Signer #1 public key MD5 digest: f3714d30107c5b7d1e29325669b80e05

我这里只是粘取了部分信息。这算是对我们的apk一个简单的验证。

3. 轮转签名apk

  1. 首先是不知道rotate都有那些指令的,只需要运行apksigner rotate:
  D:\Sdk\build-tools\29.0.0-rc2>apksigner rotate
USAGE: apksigner rotate [options]

This takes the provided keys and creates a SigningCertificateLineage entry linking the old to the
new, for use in a key rotation scenario using APK Signature Scheme v3.


......
省略部分
.....
        EXAMPLES

1. Create a new SigningCertificateLineage to enable rotation:
$ apksigner rotate --out /path/to/new/file --old-signer --ks release.jks \
    --new-signer --ks release2.jks

2. Extend an existing SigningCertificateLineage to rotate again after previous rotation:
$ apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file \
    --old-signer --ks release2.jks --new-signer --ks release3.jks

3. Create a new SigningCertificateLineage with explicit capabilities for the previous signer:
$ apksigner rotate --out /path/to/new/file --old-signer --ks release.jks \
    --set-installed-data true --set-shared-uid true --set-permission true --set-rollback false \
    --set-auth true --new-signer --ks release2.jks

我们只需要看懂上面的EXAMPLES就可以了:
1.就是普通的轮转签名
2.可以理解为1生成的签名再次轮转
3.生成一个显示的签名证书沿袭(具体没有使用)

开始执行轮转:

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盘根目录。

  1. 那么要生成旋转apk,一定会有apk签名的。
    不清楚 sign有哪些指令,只需要运行一下。
D:\Sdk\build-tools\29.0.0-rc2>apksigner sign
USAGE: apksigner sign [options] apk

This signs the provided APK, stripping out any pre-existing signatures. Signing
is performed using one or more signers, each represented by an asymmetric key
pair and a corresponding certificate. Typically, an APK is signed by just one
signer. For each signer, you need to provide the signer's private key and
certificate.

.........
     省略      GENERAL OPTIONS  和   PER-SIGNER OPTIONS
.........

        EXAMPLES

1. Sign an APK, in-place, using the one and only key in keystore release.jks:
$ apksigner sign --ks release.jks app.apk

1. Sign an APK, without overwriting, using the one and only key in keystore
   release.jks:
$ apksigner sign --ks release.jks --in app.apk --out app-signed.apk

3. Sign an APK using a private key and certificate stored as individual files:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk

4. Sign an APK using two keys:
$ apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk

5. Sign an APK using PKCS #11 JCA Provider:
$ apksigner sign --provider-class sun.security.pkcs11.SunPKCS11 \
    --provider-arg token.cfg --ks NONE --ks-type PKCS11 app.apk

6. Sign an APK using a non-ASCII password KeyStore created on English Windows.
   The --pass-encoding parameter is not needed if apksigner is being run on
   English Windows with Java 8 or older.
$ apksigner sign --ks release.jks --pass-encoding ibm437 app.apk

7. Sign an APK on Windows using a non-ASCII password KeyStore created on a
   modern OSX or Linux machine:
$ apksigner sign --ks release.jks --pass-encoding utf-8 app.apk

8. Sign an APK with rotated signing certificate:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \
    --lineage /path/to/signing/history/lineage app.apk

从上面可以看到第8条就是我们今天的主角了。
下面开始签名:

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>

执行完成上面的步骤,我们的签名就算是完成了。

  1. 验证签名:
    直接来一个图解释问题:


    验证

    从上图看到支持V3签名。

4.验证

先安装一个支持V2签名的apk到手机。然后看支持V3签名的apk能否覆盖安装。如果可以表示安装成功。

总结

今天主要就是学习一下轮转签名和apksigner的一些使用,算是一个小技能的提升。

推荐阅读更多精彩内容