美文网首页
Android使用apksigner轮转签名的小整理

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

作者: yzzCool | 来源:发表于2019-04-17 17:22 被阅读0次

    前言

    这篇文章主要是分析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的一些使用,算是一个小技能的提升。

    相关文章

      网友评论

          本文标题:Android使用apksigner轮转签名的小整理

          本文链接:https://www.haomeiwen.com/subject/ivynwqtx.html