apksigner - Referenzhandbuch, Optionen, Befehlsbeispiele


NAME

apksigner - Android-APKs signieren und verifizieren

ZUSAMMENFASSUNG

apksigner [options] apk

apksigner --version

apksigner --help

BESCHREIBUNG

Ein Befehlszeilentool zum Signieren von Android-APK-Dateien und zum Überprüfen, ob Signaturen von APK-Dateien auf Android-Geräten überprüft werden.

apk ist eine vorhandene Datei, die signiert oder überprüft werden muss.

apksig ist ein Projekt, das darauf abzielt, das Signieren von APKs zu vereinfachen und zu prüfen, ob die Signaturen von APKs auf Android überprüft werden sollen. apksig unterstützt JAR-Signierung (von Android seit dem ersten Tag verwendet) und APK Signature Scheme v2 (unterstützt seit Android Nougat, API Level 24).

Das Hauptmerkmal von apksig besteht darin, dass es Unterschiede in der APK-Signaturüberprüfungslogik zwischen verschiedenen Versionen der Android-Plattform kennt. apksig kann somit prüfen, ob eine signierte APK auf allen von der APK unterstützten Android-Plattformversionen verifiziert werden soll. Beim Signieren einer APK wählt apksig die am besten geeigneten kryptografischen Algorithmen basierend auf den Android-Plattformversionen aus, die von der zu signierenden APK unterstützt werden.

BEFEHLE

sign

Dadurch wird die bereitgestellte APK signiert und alle bereits vorhandenen Signaturen entfernt. Die Signierung erfolgt mit einem oder mehreren Unterzeichnern, die jeweils durch ein asymmetrisches Schlüsselpaar und ein entsprechendes Zertifikat repräsentiert werden. Normalerweise wird ein APK von nur einem Unterzeichner signiert. Für jeden Unterzeichner müssen Sie den privaten Schlüssel und das Zertifikat des Unterzeichners bereitstellen.

verify

Dadurch wird geprüft, ob die bereitgestellte APK auf Android überprüft werden kann. Standardmäßig wird geprüft, ob das APK auf allen vom APK unterstützten Android-Plattformversionen überprüft (wie mit minSdkVersion in AndroidManifest.xml deklariert). Verwenden Sie --min-sdk-version und/oder --max-sdk-version, um das APK anhand eines benutzerdefinierten Bereichs von API-Levels zu überprüfen.

lineage

Dadurch werden die Fähigkeiten eines oder mehrerer Unterzeichner in der bereitgestellten SigningCertificateLineage geändert. Dies kann verwendet werden, um die Funktionen eines vorherigen Signaturzertifikats zu widerrufen, sobald die Installationsbasis auf das neue Signaturzertifikat migriert wurde.

rotate

Dies nimmt die bereitgestellten Schlüssel und erstellt einen SigningCertificateLineage-Eintrag, der den alten mit dem neuen verknüpft, zur Verwendung in einem Schlüsselrotationsszenario mit APK Signature Scheme v3.

version

Zeigen Sie die Versionsnummer dieses Tools an und beenden Sie das Programm

help

Zeigen Sie diese Nutzungsseite an und verlassen Sie sie

OPTIONEN

-v, --verbose

Ausführlicher Ausgabemodus

-h, --help

Hilfe zu diesem Befehl anzeigen und beenden

-Werr

Behandeln Sie Warnungen als Fehler

sign

Signieren Sie die bereitgestellte APK

--out

Datei, in die das signierte APK ausgegeben werden soll. Standardmäßig wird das APK direkt signiert und überschreibt die Eingabedatei.

--min-sdk-version

Niedrigste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der Wert aus AndroidManifest.xml verwendet. Je höher der Wert, desto stärkere Sicherheitsparameter werden beim Signieren verwendet.

--max-sdk-version

Höchste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der höchstmögliche Wert verwendet.

--v1-signing-enabled

Ob das Signieren mit dem JAR-Signaturschema (auch bekannt als v1-Signaturschema, das in Android seit dem ersten Tag verwendet wird) aktiviert werden soll. Standardmäßig ist das Signieren mit diesem Schema basierend auf der minimalen und maximalen SDK-Version aktiviert (siehe --min-sdk-version und --max-sdk-version).

--v2-signing-enabled

Ob das Signieren mit APK Signature Scheme v2 (auch bekannt als v2-Signaturschema, das in Android Nougat, API Level 24 eingeführt wurde) aktiviert werden soll. Standardmäßig ist das Signieren mit diesem Schema basierend auf der minimalen und maximalen SDK-Version aktiviert (siehe --min-sdk-version und --max-sdk-version).

per-signer options

Diese Optionen geben die Konfiguration eines bestimmten Unterzeichners an. Um die Optionen verschiedener Unterzeichner abzugrenzen, verwenden Sie --next-signer.

--next-signer

Begrenzt die Optionen zweier verschiedener Unterzeichner. Es besteht keine Notwendigkeit, diese Option zu verwenden, wenn nur ein Unterzeichner verwendet wird.

--v1-signer-name

Basisname für Dateien, die die Signatur des JAR-Signaturschemas (auch bekannt als v1-Schema) dieses Unterzeichners enthalten. Standardmäßig wird der KeyStore-Schlüsselalias oder Basisname der Schlüsseldatei verwendet.

per-signer signing key & certificate options

Es gibt zwei Möglichkeiten, den privaten Schlüssel und das Zertifikat des Unterzeichners bereitzustellen: (1) Java KeyStore (siehe --ks) oder (2) private Schlüsseldatei im PKCS #8-Format und Zertifikatdatei im X.509-Format (siehe --key). und --cert).

--ks

Laden Sie den privaten Schlüssel und die Zertifikatskette aus dem Java KeyStore, der aus der angegebenen Datei initialisiert wurde. NONE bedeutet, dass KeyStore keine Datei benötigt, was bei einigen PKCS #11-KeyStores der Fall ist.

--ks-key-alias

Alias, unter dem der private Schlüssel und das Zertifikat im KeyStore gespeichert werden. Dies muss angegeben werden, wenn der KeyStore mehrere Schlüssel enthält.

--ks-pass

KeyStore-Passwort (siehe --ks). Folgende Formate werden unterstützt:

  • pass: Inline bereitgestelltes Passwort

  • env: Passwort, das in der genannten Umgebungsvariablen bereitgestellt wird

  • Datei: Passwort, das in der genannten Datei als einzelne Zeile bereitgestellt wird

  • stdin-Passwort, das in der Standardeingabe als einzelne Zeile bereitgestellt wird

Zum Öffnen eines KeyStores ist ein Passwort erforderlich. Standardmäßig fordert das Tool über die Konsole oder die Standardeingabe zur Eingabe eines Passworts auf. Wenn dieselbe Datei (einschließlich Standardeingabe) für die Bereitstellung mehrerer Passwörter verwendet wird, werden die Passwörter Zeile für Zeile aus der Datei gelesen. Passwörter werden in der Reihenfolge gelesen, in der die Unterzeichner angegeben werden, und innerhalb jedes Unterzeichners wird das KeyStore-Passwort gelesen, bevor das Schlüsselpasswort gelesen wird.

--key-pass

Passwort, mit dem der private Schlüssel geschützt ist. Standardmäßig wird davon ausgegangen, dass KeyStore-Schlüssel mit demselben Passwort wie ihr KeyStore geschützt sind (siehe --ks-pass). Folgende Formate werden unterstützt:

  • pass: Inline bereitgestelltes Passwort

  • env: Passwort, das in der genannten Umgebungsvariablen bereitgestellt wird

  • Datei: Passwort, das in der benannten Datei als einzelne Zeile bereitgestellt wird. Standard-Passwort, das in der Standardeingabe bereitgestellt wird, als einzelne Zeile

Wenn der Schlüssel durch ein Passwort geschützt ist, fordert das Tool standardmäßig über die Konsole oder die Standardeingabe zur Eingabe des Passworts auf. Wenn dieselbe Datei (einschließlich Standardeingabe) für die Bereitstellung mehrerer Passwörter verwendet wird, werden die Passwörter Zeile für Zeile aus der Datei gelesen. Passwörter werden in der Reihenfolge gelesen, in der die Unterzeichner angegeben werden, und innerhalb jedes Unterzeichners wird das KeyStore-Passwort gelesen, bevor das Schlüsselpasswort gelesen wird.

--pass-encoding

Zusätzliche Zeichenkodierung (z. B. ibm437 oder utf-8), um nach Passwörtern zu suchen, die Nicht-ASCII-Zeichen enthalten. Von keytool erstellte KeyStores werden oft nicht mit der Unicode-Form des Passworts verschlüsselt, sondern mit der Form, die durch die Codierung des Passworts mithilfe der Zeichenkodierung der Konsole entsteht. apksigner versucht standardmäßig mit mehreren Formen des Passworts zu entschlüsseln: der Unicode-Form, der mit dem JVM-Standardzeichensatz kodierten Form und, unter Java 8 und älter, der mit dem Konsolen-Zeichensatz kodierten Form. Unter Java 9 kann apksigner den Zeichensatz der Konsole nicht erkennen und muss möglicherweise mit --pass-encoding versehen werden, wenn ein Nicht-ASCII-Passwort verwendet wird. --pass-encoding muss möglicherweise auch für einen KeyStore bereitgestellt werden, der von keytool auf einem anderen Betriebssystem oder in einem anderen Gebietsschema erstellt wurde.

--ks-type

Typ/Algorithmus des zu verwendenden KeyStores. Standardmäßig wird der Standardtyp verwendet.

--ks-provider-name

Name des JCA-Anbieters, von dem die KeyStore-Implementierung angefordert werden soll. Standardmäßig wird der Anbieter mit der höchsten Priorität verwendet. Die alternative Möglichkeit zur Angabe eines Anbieters finden Sie unter --ks-provider-class.

--ks-provider-class

Vollständig qualifizierter Klassenname des JCA-Anbieters, von dem die KeyStore-Implementierung angefordert werden soll. Standardmäßig wird der Anbieter basierend auf --ks-provider-name ausgewählt.

--ks-provider-arg

Wert, der an den Konstruktor der durch --ks-provider-class angegebenen JCA-Provider-Klasse übergeben werden soll. Der Wert wird als java.lang.String an den Konstruktor übergeben. Standardmäßig wird der Konstruktor des Anbieters ohne Argumente verwendet.

--key

Laden Sie den privaten Schlüssel aus der angegebenen Datei. Wenn der Schlüssel passwortgeschützt ist, wird das Passwort über die Standardeingabe abgefragt, sofern nicht mit --key-pass etwas anderes angegeben wird. Die Datei muss im PKCS #8 DER-Format vorliegen.

--cert

Laden Sie die Zertifikatskette aus der angegebenen Datei. Die Datei muss im X.509 PEM- oder DER-Format vorliegen.

verify

Überprüfen Sie, ob die bereitgestellte APK voraussichtlich auf Android überprüft werden kann

--print-certs

Informationen zu den Signaturzertifikaten der APK anzeigen

--min-sdk-version

Niedrigste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der Wert aus AndroidManifest.xml verwendet.

--max-sdk-version

Höchste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der höchstmögliche Wert verwendet.

BEISPIELE

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. Signieren Sie eine APK mit dem einzigen Schlüssel in keystore release.jks:

  2. apksigner sign --ks release.jks app.apk
  3. Signieren Sie eine APK mit einem privaten Schlüssel und einem Zertifikat, die als einzelne Dateien gespeichert sind:

  4. apksigner sign --key release.pk8 --cert release.x509.pem app.apk
  5. Signieren Sie eine APK mit zwei Schlüsseln:

  6. apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verify
  1. Prüfen Sie, ob die Signaturen der APK auf allen Android-Plattformen überprüft werden sollen, die von dieser APK unterstützt werden:

  2. apksigner verify app.apk
  3. Prüfen Sie, ob die Signaturen der APK auf Android-Plattformen mit API Level 15 und höher überprüft werden sollen:

  4. apksigner verify --min-sdk-version 15 app.apk
lineage
  1. Entfernen Sie alle Funktionen von einem vorherigen Unterzeichner in der Linie:

  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. Zeigen Sie Details zu den Signaturzertifikaten und ihren Funktionen in der Linie an:

  2. apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotate
  1. Erstellen Sie eine neue SigningCertificateLineage, um die Rotation zu aktivieren:

  2. apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
  1. Erweitern Sie eine vorhandene SigningCertificateLineage, um sie nach der vorherigen Rotation erneut zu rotieren:

  2. apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
  1. Erstellen Sie eine neue SigningCertificateLineage mit expliziten Funktionen für den vorherigen Unterzeichner:

  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

SIEHE AUCH

signapk(1) jar(1) zip(1) zipalign(1)

https://source.android.com/devices/tech/ota/sign_builds.html

AUTOREN

Das Android Open Source-Projekt.