apksigner - подписывайте и проверяйте Android APK
apksigner [options] apk
apksigner --version
apksigner --help
Инструмент командной строки для подписи файлов Android APK и для проверки того, будут ли подписи файлов APK проверяться на устройствах Android.
apk – это существующий файл, который необходимо подписать или проверить.
apksig — это проект, целью которого является упрощение подписи APK и проверка того, должны ли подписи APK проверяться на Android. apksig поддерживает подписывание JAR (используется Android с первого дня) и схему подписи APK v2 (поддерживается начиная с Android Nougat, уровень API 24).
Ключевой особенностью apksig является то, что он знает о различиях в логике проверки подписи APK между разными версиями платформы Android. Таким образом, apksig может проверить, ожидается ли проверка подписанного APK на всех версиях платформы Android, поддерживаемых APK. При подписании APK apksig выберет наиболее подходящие криптографические алгоритмы на основе версий платформы Android, поддерживаемых подписываемым APK.
sign
Это подписывает предоставленный APK, удаляя все ранее существовавшие подписи. Подписание выполняется с использованием одного или нескольких подписывающих лиц, каждое из которых представлено парой асимметричных ключей и соответствующим сертификатом. Как правило, APK подписывается только одним подписывающим лицом. Для каждой подписывающей стороны необходимо предоставить закрытый ключ и сертификат подписывающей стороны.
verify
Это проверяет, будет ли предоставленный APK проверен на Android. По умолчанию это проверяет, будет ли APK проверяться на всех версиях платформы Android, поддерживаемых APK (как указано с помощью minSdkVersion в AndroidManifest.xml). Используйте --min-sdk-version и/или --max-sdk-version, чтобы проверить APK на соответствие пользовательскому диапазону уровней API.
lineage
Это изменяет возможности одной или нескольких подписывающих сторон в предоставленном SigningCertificateLineage. Это можно использовать для отзыва возможностей предыдущего сертификата подписи после переноса базы установки на новый сертификат подписи.
rotate
Это берет предоставленные ключи и создает запись SigningCertificateLineage, связывающую старый с новым, для использования в сценарии ротации ключей с использованием схемы подписи APK v3.
version
Показать номер версии этого инструмента и выйти
help
Показать эту страницу использования и выйти
Подробный режим вывода
Показать справку об этой команде и выйти
Рассматривайте предупреждения как ошибки
sign
Подпишите предоставленный APK
Файл, в который выводится подписанный APK. По умолчанию APK подписывается на месте, перезаписывая входной файл.
Самый низкий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется значение из AndroidManifest.xml. Чем выше значение, тем более строгие параметры безопасности используются при подписи.
Самый высокий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется максимально возможное значение.
Включить ли подписание с использованием схемы подписания JAR (также известной как схема подписания v1, которая используется в Android с первого дня). По умолчанию подписание с использованием этой схемы включено в зависимости от минимальной и максимальной версии SDK (см. --min-sdk-version и --max-sdk-version).
Включить ли подписание с помощью схемы подписи APK v2 (схема подписи v2, представленная в Android Nougat, уровень API 24). По умолчанию подписание с использованием этой схемы включено в зависимости от минимальной и максимальной версии SDK (см. --min-sdk-version и --max-sdk-version).
per-signer options
Эти параметры определяют конфигурацию конкретной подписывающей стороны. Чтобы разграничить параметры разных подписывающих, используйте --next-signer.
Разграничивает варианты двух разных подписантов. Нет необходимости использовать эту опцию, если используется только одна подписывающая сторона.
Базовое имя для файлов, содержащих сигнатуру схемы подписи JAR (она же схема v1) этой подписывающей стороны. По умолчанию используется псевдоним ключа KeyStore или базовое имя файла ключа.
per-signer signing key & certificate options
Есть два способа предоставить закрытый ключ и сертификат подписывающей стороны: (1) Java KeyStore (см. --ks) или (2) файл закрытого ключа в формате PKCS #8 и файл сертификата в формате X.509 (см. --key и --серт).
Загрузить закрытый ключ и цепочку сертификатов из хранилища ключей Java, инициализированного из указанного файла. NONE означает, что KeyStore не нужен файл, как в случае с некоторыми хранилищами ключей PKCS #11.
Псевдоним, под которым закрытый ключ и сертификат хранятся в KeyStore. Это необходимо указать, если KeyStore содержит несколько ключей.
Пароль хранилища ключей (см. --ks). Поддерживаются следующие форматы:
pass: пароль предоставляется встроенным
env: пароль указан в именованной переменной окружения
файл: пароль, указанный в названном файле, в виде одной строки
пароль stdin предоставляется на стандартном вводе в виде одной строки
Для открытия KeyStore требуется пароль. По умолчанию инструмент запрашивает пароль через консоль или стандартный ввод. Когда один и тот же файл (включая стандартный ввод) используется для предоставления нескольких паролей, пароли считываются из файла по одной строке за раз. Пароли считываются в том порядке, в котором указаны подписывающие лица, и для каждого подписывающего пароль KeyStore считывается до считывания пароля ключа.
Пароль, которым защищен закрытый ключ. По умолчанию предполагается, что ключи KeyStore защищены тем же паролем, что и их KeyStore (см. --ks-pass). Поддерживаются следующие форматы:
pass: пароль предоставляется встроенным
env: пароль указан в именованной переменной окружения
файл: пароль, указанный в именованном файле, в виде одной строки stdin пароль, предоставленный при стандартном вводе, в виде одной строки
По умолчанию, если ключ защищен паролем, инструмент запросит пароль через консоль или стандартный ввод. Когда один и тот же файл (включая стандартный ввод) используется для предоставления нескольких паролей, пароли считываются из файла по одной строке за раз. Пароли считываются в том порядке, в котором указаны подписывающие лица, и для каждого подписывающего пароль KeyStore считывается до считывания пароля ключа.
Дополнительная кодировка символов (например, ibm437 или utf-8) для проверки паролей, содержащих символы, отличные от ASCII. Хранилища ключей, созданные keytool, часто шифруются не с использованием формы пароля Unicode, а с использованием формы, полученной путем кодирования пароля с использованием кодировки символов консоли. apksigner по умолчанию пытается расшифровать, используя несколько форм пароля: форму Unicode, форму, закодированную с использованием кодировки JVM по умолчанию, и, в Java 8 и старше, форму, закодированную с использованием набора символов консоли. В Java 9 apksigner не может определить кодировку консоли, и может потребоваться указать параметр --pass-encoding при использовании пароля, отличного от ASCII. --pass-encoding также может потребоваться для KeyStore, созданного keytool в другой ОС или в другой локали.
Тип/алгоритм KeyStore для использования. По умолчанию используется тип по умолчанию.
Имя поставщика JCA, у которого запрашивается реализация KeyStore. По умолчанию используется поставщик с наивысшим приоритетом. См. --ks-provider-class для альтернативного способа указания провайдера.
Полное имя класса поставщика JCA, у которого запрашивается реализация KeyStore. По умолчанию провайдер выбирается на основе --ks-provider-name.
Значение для передачи в конструктор класса поставщика JCA, указанное параметром --ks-provider-class. Значение передается в конструктор как java.lang.String. По умолчанию используется конструктор поставщика без аргументов.
Загрузить закрытый ключ из указанного файла. Если ключ защищен паролем, пароль будет запрашиваться через стандартный ввод, если не указано иное с помощью --key-pass. Файл должен быть в формате PKCS #8 DER.
Загрузить цепочку сертификатов из указанного файла. Файл должен быть в формате X.509 PEM или DER.
verify
Проверьте, ожидается ли проверка предоставленного APK на Android.
Показать информацию о сертификатах подписи APK
Самый низкий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется значение из AndroidManifest.xml.
Самый высокий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется максимально возможное значение.
apksigner sign --ks release.jks app.apk apksigner verify --verbose app.apk apksigner lineage --in /path/to/existing/lineage --print-certs -v apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
sign
Подпишите APK, используя единственный ключ в хранилище ключей release.jks:
apksigner sign --ks release.jks app.apk
Подпишите APK, используя закрытый ключ и сертификат, хранящиеся в виде отдельных файлов:
apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Подпишите APK двумя ключами:
apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verify
Проверьте, должны ли подписи APK проверяться на всех платформах Android, заявленных как поддерживаемых этим APK:
apksigner verify app.apk
Проверьте, ожидается ли проверка подписи APK на платформах Android с уровнем API 15 и выше:
apksigner verify --min-sdk-version 15 app.apk
lineage
Удалите все возможности предыдущего подписавшего в родословной:
apksigner lineage --in /path/to/existing/lineage --out /path/to/new/file --signer --ks release.jks --set-installed-data false --set-shared-uid false --set-permission false --set-rollback false --set-auth false
Отображение подробностей о сертификатах подписи и их возможностях в родословной:
apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotate
Создайте новый SigningCertificateLineage, чтобы включить ротацию:
apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
Расширьте существующий SigningCertificateLineage для повторной ротации после предыдущей ротации:
apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
Создайте новый SigningCertificateLineage с явными возможностями для предыдущей подписывающей стороны:
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
signapk(1) jar(1) zip(1) zipalign(1)
https://source.android.com/devices/tech/ota/sign_builds.html
Проект Android с открытым исходным кодом.