【问题标题】:Apksigner does not verify signatureApksigner 不验证签名
【发布时间】:2019-02-20 08:57:50
【问题描述】:

我尝试使用 apksigner 验证最新版 Gmail 应用(版本 8.11.25.224)的签名,但失败了。

我用过:

apksigner verifiy --verbose --print-certs <apk.file>

结果是:

DOES NOT VERIFY
ERROR: APK Signature Scheme v2 signer #1 Malformed additional attribute #1

我正在寻找为什么会发生这种情况的解释,但我找不到任何解决此问题的方法。我做了一点实验,如果你在 apksigner 命令的选项中添加--min-sdk-version 28 那么结果是:

Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): false
Number of signers: 1
Signer #1 certificate DN: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Signer #1 certificate SHA-256 digest: f0fd...
Signer #1 certificate SHA-1 digest: 3891...
Signer #1 certificate MD5 digest: cde9...
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 2b06...
Signer #1 public key SHA-1 digest: b2da...
Signer #1 public key MD5 digest: a90c...

如果你使用 jarsigner 工具,结果是:


WARNING:
This jar contains entries whoes certificate chain is invalid.
Reason: PKIX path bulding failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
This jar contains signatures that does not include a timestamp. Without a timestamp, users may not be able to validate this jar after the signers certificate's expiration date (2036-01-08) or after any future revocation date.

使用-verbose-certs 选项重新运行以获取更多详细信息。我上传了我的 Gmail APK 文件。

【问题讨论】:

  • 你使用的是什么版本?

标签: android apk android-security apksigner


【解决方案1】:

如果 APK 使用 v3 签名方案进行签名,但 apksigner 的版本已过时且不支持此方案,则会发生这种情况。阅读警告:

apksigner version
    0.8    
apksigner verify --verbose "Signal-website-universal-release-4.50.5.apk"
    DOES NOT VERIFY
    ERROR: APK Signature Scheme v2 signer #1: Malformed additional attribute #1
    WARNING: APK Signature Scheme v2 signer #1: Unknown signature algorithm: 0x421

因此,签名算法对于 apksigner 版本 0.8 是未知的。我不会称其为错误(就像Pierre 所做的那样),但错误消息可能会更清楚,如果旧版本能够至少检查 v2 签名会更好。 最烦人的一点(Freedo 提到)是 Ubuntu 仍然为所有版本(packages.ubuntu.com)提供一个旧的 0.8 apksigner 包,即使是最新的 Ubuntu 19.10(eoan),并且没有更新版本的 ppa。 您至少需要 0.9 版本,该版本目前只是 Android SDK 构建工具的一部分。

对我来说最简单的方法是安装 Android Studio 并至少打开一次以自动下载最新的 Android SDK。 Ubuntu 19.10 App Center 确实将其安装为 snap,然后 SDK 位于我的主目录中:

./Android/Sdk/build-tools/29.0.2/apksigner version
    0.9
./Android/Sdk/build-tools/29.0.2/apksigner verify --verbose --print-certs "Signal-website-universal-release-4.50.5.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
    Number of signers: 1
    Signer #1 certificate DN: CN=Whisper Systems, OU=Research and Development, O=Whisper Systems, L=Pittsburgh, ST=PA, C=US
    Signer #1 certificate SHA-256 digest: 29f34e5f27f211b424bc5bf9d67162c0eafba2da35af35c16416fc446276ba26
    Signer #1 certificate SHA-1 digest: 45989dc9ad8728c2aa9a82fa55503e34a8879374
    Signer #1 certificate MD5 digest: d90db364e32fa3a7bda4c290fb65e310
    Signer #1 key algorithm: RSA
    Signer #1 key size (bits): 1024
    Signer #1 public key SHA-256 digest: 75336a3cc9edb64202cd77cd4caa6396a9b5fc3c78c58660313c7098ea248a55
    Signer #1 public key SHA-1 digest: b46cbed18d6fbbe42045fdb93f5032c943d80266
    Signer #1 public key MD5 digest: 0f9c33bbd45db0218c86ac378067538d
    WARNING: META-INF/* not protected by signature.

META-INF 文件夹中的文件有很多警告,因为该文件夹被排除在签名之外,包含大量版本文件和证书。这也是为什么仅仅从 APK 中读取证书是不够的,就像一些 pages 推荐的那样。

编辑: 另见“How to verify SHA256 fingerprint of APK

【讨论】:

    【解决方案2】:

    在验证使用 v3 签名方案签名的 APK 的签名时,apksigner 存在两个错误。 apksigner 的下一个版本应该修复了这两个问题。

    【讨论】:

    • 你有这个错误的链接吗?我在 Android 问题跟踪器上寻找 apksigner 中的错误,但我没有找到任何东西,这就是为什么我也在 Android 问题跟踪器中发布,因为我在猜测一个错误
    • 我认为没有人在问题跟踪器中提交错误。随意这样做。
    • 我已经在问题跟踪器中打开了一个问题,但我不知道这是否相同。我是这个行业的新手;)。但是您是如何知道 apksigner 中的错误的呢?我照顾了它将近一个月,但没有找到任何相关信息。
    • 我在 Google 工作,我联系了一位开发 apksigner 的开发人员。该错误不影响 Android 设备上的签名验证。如果您使用旧版本的 apksigner,验证应该会成功。
    • 我也尝试了一些旧版本,但它们都有相同的错误。我还在 Android 设备上测试了一些场景,但它们都可以正常工作。谢谢你的帮助!我真的很感激。
    猜你喜欢
    • 2022-07-16
    • 2021-07-07
    • 2022-01-10
    • 1970-01-01
    • 2018-08-13
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多