apksigner - справочное руководство, опции, примеры команд


ИМЯ

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

Показать эту страницу использования и выйти

ПАРАМЕТРЫ

-v, --verbose

Подробный режим вывода

-h, --help

Показать справку об этой команде и выйти

-Werr

Рассматривайте предупреждения как ошибки

sign

Подпишите предоставленный APK

--out

Файл, в который выводится подписанный APK. По умолчанию APK подписывается на месте, перезаписывая входной файл.

--min-sdk-version

Самый низкий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется значение из AndroidManifest.xml. Чем выше значение, тем более строгие параметры безопасности используются при подписи.

--max-sdk-version

Самый высокий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется максимально возможное значение.

--v1-signing-enabled

Включить ли подписание с использованием схемы подписания JAR (также известной как схема подписания v1, которая используется в Android с первого дня). По умолчанию подписание с использованием этой схемы включено в зависимости от минимальной и максимальной версии SDK (см. --min-sdk-version и --max-sdk-version).

--v2-signing-enabled

Включить ли подписание с помощью схемы подписи APK v2 (схема подписи v2, представленная в Android Nougat, уровень API 24). По умолчанию подписание с использованием этой схемы включено в зависимости от минимальной и максимальной версии SDK (см. --min-sdk-version и --max-sdk-version).

per-signer options

Эти параметры определяют конфигурацию конкретной подписывающей стороны. Чтобы разграничить параметры разных подписывающих, используйте --next-signer.

--next-signer

Разграничивает варианты двух разных подписантов. Нет необходимости использовать эту опцию, если используется только одна подписывающая сторона.

--v1-signer-name

Базовое имя для файлов, содержащих сигнатуру схемы подписи JAR (она же схема v1) этой подписывающей стороны. По умолчанию используется псевдоним ключа KeyStore или базовое имя файла ключа.

per-signer signing key & certificate options

Есть два способа предоставить закрытый ключ и сертификат подписывающей стороны: (1) Java KeyStore (см. --ks) или (2) файл закрытого ключа в формате PKCS #8 и файл сертификата в формате X.509 (см. --key и --серт).

--ks

Загрузить закрытый ключ и цепочку сертификатов из хранилища ключей Java, инициализированного из указанного файла. NONE означает, что KeyStore не нужен файл, как в случае с некоторыми хранилищами ключей PKCS #11.

--ks-key-alias

Псевдоним, под которым закрытый ключ и сертификат хранятся в KeyStore. Это необходимо указать, если KeyStore содержит несколько ключей.

--ks-pass

Пароль хранилища ключей (см. --ks). Поддерживаются следующие форматы:

  • pass: пароль предоставляется встроенным

  • env: пароль указан в именованной переменной окружения

  • файл: пароль, указанный в названном файле, в виде одной строки

  • пароль stdin предоставляется на стандартном вводе в виде одной строки

Для открытия KeyStore требуется пароль. По умолчанию инструмент запрашивает пароль через консоль или стандартный ввод. Когда один и тот же файл (включая стандартный ввод) используется для предоставления нескольких паролей, пароли считываются из файла по одной строке за раз. Пароли считываются в том порядке, в котором указаны подписывающие лица, и для каждого подписывающего пароль KeyStore считывается до считывания пароля ключа.

--key-pass

Пароль, которым защищен закрытый ключ. По умолчанию предполагается, что ключи KeyStore защищены тем же паролем, что и их KeyStore (см. --ks-pass). Поддерживаются следующие форматы:

  • pass: пароль предоставляется встроенным

  • env: пароль указан в именованной переменной окружения

  • файл: пароль, указанный в именованном файле, в виде одной строки stdin пароль, предоставленный при стандартном вводе, в виде одной строки

По умолчанию, если ключ защищен паролем, инструмент запросит пароль через консоль или стандартный ввод. Когда один и тот же файл (включая стандартный ввод) используется для предоставления нескольких паролей, пароли считываются из файла по одной строке за раз. Пароли считываются в том порядке, в котором указаны подписывающие лица, и для каждого подписывающего пароль KeyStore считывается до считывания пароля ключа.

--pass-encoding

Дополнительная кодировка символов (например, ibm437 или utf-8) для проверки паролей, содержащих символы, отличные от ASCII. Хранилища ключей, созданные keytool, часто шифруются не с использованием формы пароля Unicode, а с использованием формы, полученной путем кодирования пароля с использованием кодировки символов консоли. apksigner по умолчанию пытается расшифровать, используя несколько форм пароля: форму Unicode, форму, закодированную с использованием кодировки JVM по умолчанию, и, в Java 8 и старше, форму, закодированную с использованием набора символов консоли. В Java 9 apksigner не может определить кодировку консоли, и может потребоваться указать параметр --pass-encoding при использовании пароля, отличного от ASCII. --pass-encoding также может потребоваться для KeyStore, созданного keytool в другой ОС или в другой локали.

--ks-type

Тип/алгоритм KeyStore для использования. По умолчанию используется тип по умолчанию.

--ks-provider-name

Имя поставщика JCA, у которого запрашивается реализация KeyStore. По умолчанию используется поставщик с наивысшим приоритетом. См. --ks-provider-class для альтернативного способа указания провайдера.

--ks-provider-class

Полное имя класса поставщика JCA, у которого запрашивается реализация KeyStore. По умолчанию провайдер выбирается на основе --ks-provider-name.

--ks-provider-arg

Значение для передачи в конструктор класса поставщика JCA, указанное параметром --ks-provider-class. Значение передается в конструктор как java.lang.String. По умолчанию используется конструктор поставщика без аргументов.

--key

Загрузить закрытый ключ из указанного файла. Если ключ защищен паролем, пароль будет запрашиваться через стандартный ввод, если не указано иное с помощью --key-pass. Файл должен быть в формате PKCS #8 DER.

--cert

Загрузить цепочку сертификатов из указанного файла. Файл должен быть в формате X.509 PEM или DER.

verify

Проверьте, ожидается ли проверка предоставленного APK на Android.

--print-certs

Показать информацию о сертификатах подписи APK

--min-sdk-version

Самый низкий уровень API, на котором будут проверяться подписи этого APK. По умолчанию используется значение из AndroidManifest.xml.

--max-sdk-version

Самый высокий уровень 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
  1. Подпишите APK, используя единственный ключ в хранилище ключей release.jks:

  2. apksigner sign --ks release.jks app.apk
  3. Подпишите APK, используя закрытый ключ и сертификат, хранящиеся в виде отдельных файлов:

  4. apksigner sign --key release.pk8 --cert release.x509.pem app.apk
  5. Подпишите APK двумя ключами:

  6. apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verify
  1. Проверьте, должны ли подписи APK проверяться на всех платформах Android, заявленных как поддерживаемых этим APK:

  2. apksigner verify app.apk
  3. Проверьте, ожидается ли проверка подписи APK на платформах Android с уровнем API 15 и выше:

  4. apksigner verify --min-sdk-version 15 app.apk
lineage
  1. Удалите все возможности предыдущего подписавшего в родословной:

  2. 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
  1. Отображение подробностей о сертификатах подписи и их возможностях в родословной:

  2. apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotate
  1. Создайте новый SigningCertificateLineage, чтобы включить ротацию:

  2. apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
  1. Расширьте существующий SigningCertificateLineage для повторной ротации после предыдущей ротации:

  2. apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
  1. Создайте новый SigningCertificateLineage с явными возможностями для предыдущей подписывающей стороны:

  2. 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 с открытым исходным кодом.