Apksigner не проверяет подпись
Я пытался проверить подпись последнего приложения Gmail (версия 8.11.25.224) с помощью apksigner, и это не удалось.
Я использовал:
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 файл.
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 неизвестен. Я бы не назвал это ошибкой (как это делает Пьер), но сообщение об ошибке могло бы быть более ясным, и было бы лучше, если бы старая версия могла проверить хотя бы подпись v2. Самым неприятным моментом (упомянутым Фридо) является то, что Ubuntu по-прежнему поставляет старый пакет apksigner 0.8 для всех выпусков ( packages.ubuntu.com), даже самого последнего Ubuntu 19.10 (eoan), и нет ppa с более новой версией. Вам нужна как минимум версия 0.9, которая в настоящее время является только частью инструментов сборки Android SDK.
Самым простым способом для меня было установить Android Studio и открыть ее хотя бы один раз, чтобы автоматически загрузить последнюю версию Android SDK. Центр приложений Ubuntu 19.10 установил его как оснастку, после чего 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, как рекомендуют некоторые страницы.
Изменить: См. Также " Как проверить SHA256 отпечаток APK"
При проверке подписи APK, подписанных с помощью схемы подписи v3, в apksigner есть две ошибки. В следующем выпуске apksigner должны быть исправлены эти две проблемы.
(Внутренний источник)