6

我试图用 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

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

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 文件。

4

2 回答 2

11

如果 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 读取证书是不够的,就像一些页面推荐的那样。

编辑:另见“如何验证 APK 的 SHA256 指纹

于 2019-11-29T09:57:24.170 回答
1

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

于 2019-02-20T16:15:14.933 回答