apksigner

Mit dem apksigner-Tool, das in Version 24.0.3 und höher der Android SDK Build Tools verfügbar ist, kannst du APKs signieren und prüfen, ob die Signatur eines APKs erfolgreich auf allen Versionen der Android-Plattform verifiziert wird, die von diesem APK unterstützt werden.

Auf dieser Seite finden Sie eine kurze Anleitung zur Verwendung des Tools sowie eine Referenz für die verschiedenen Befehlszeilenoptionen, die das Tool unterstützt. Eine ausführlichere Beschreibung, wie das apksigner-Tool zum Signieren deiner APKs verwendet wird, findest du unter App signieren.

Achtung : Wenn Sie Ihr APK mit apksigner signieren und weitere Änderungen am APK vornehmen, wird die APK-Signatur ungültig. Wenn du dein APK mit zipalign ausrichten möchtest, musst du es vor dem Signieren des APKs verwenden.

Nutzung

APK signieren

Die Syntax zum Signieren eines APKs mit dem apksigner-Tool lautet so:

apksigner sign --ks keystore.jks |
  --key key.pk8 --cert cert.x509.pem
  [signer_options] app-name.apk

Wenn du ein APK mit dem apksigner-Tool signierst, musst du den privaten Schlüssel und das Zertifikat des Unterzeichners angeben. Sie können diese Informationen auf zwei Arten angeben:

  • Geben Sie eine KeyStore-Datei mit der Option --ks an.
  • Geben Sie die private Schlüsseldatei und die Zertifikatsdatei separat mit den Optionen --key und --cert an. Die Datei mit dem privaten Schlüssel muss im PKCS #8-Format und die Zertifikatsdatei im X.509-Format vorliegen.

Normalerweise signieren Sie ein APK nur mit einem Unterzeichner. Wenn Sie ein APK mit mehreren Unterzeichnern signieren müssen, verwenden Sie die Option --next-signer, um die allgemeinen Optionen zu trennen, die auf jeden Unterzeichner angewendet werden sollen:

apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk

Signatur eines APKs überprüfen

Die Syntax zur Bestätigung der erfolgreichen Überprüfung der APK-Signatur auf unterstützten Plattformen lautet wie folgt:

apksigner verify [options] app-name.apk

Signaturschlüssel rotieren

Die Syntax zum Rotieren einer Herkunft des Signaturzertifikats oder einer neuen Signatur von Signaturen lautet:

$ apksigner rotate --in /path/to/existing/lineage \
  --out /path/to/new/file \
  --old-signer --ks old-signer-jks \
  --new-signer --ks new-signer-jks

Optionen

Die folgenden Listen enthalten die Optionen für jeden Befehl, der vom apksigner-Tool unterstützt wird.

Befehl signieren

Der Befehl apksigner bietet die folgenden Optionen.

Allgemeine Optionen

Mit den folgenden Optionen werden grundlegende Einstellungen für einen Unterzeichner festgelegt:

--out <apk-filename>
Der Speicherort, an dem das signierte APK gespeichert werden soll. Wenn diese Option nicht explizit angegeben wird, ist das APK-Paket signiert, wodurch die APK-Eingabedatei überschrieben wird.
--min-sdk-version <integer>
Das niedrigste Android-Framework-API-Level, das apksigner verwendet, um zu bestätigen, dass die APK-Signatur verifiziert wird. Höhere Werte ermöglichen dem Tool, beim Signieren der App stärkere Sicherheitsparameter zu verwenden. Dabei wird aber die Verfügbarkeit des APKs für Geräte mit neueren Android-Versionen eingeschränkt. Standardmäßig verwendet apksigner den Wert des Attributs minSdkVersion aus der Manifestdatei der App.
--max-sdk-version <integer>
Das höchste Android Framework API-Level, das apksigner verwendet, um zu bestätigen, dass die APK-Signatur verifiziert wird. Standardmäßig verwendet das Tool das höchstmögliche API-Level.
--rotation-min-sdk-version <integer>
Das niedrigste API-Level, das der rotierte Signaturschlüssel des APKs zum Generieren der APK-Signatur verwenden soll. Der ursprüngliche (nicht rotierte) Signaturschlüssel für das APK wird für alle früheren Plattformversionen verwendet. Standardmäßig werden rotierte Signaturschlüssel, die auf Geräten mit Android 13 (API-Level 33) oder höher unterstützt werden, mit dem Signaturblock der Version 3.1 verwendet.

Hinweis : Wenn deine App auf einem Gerät mit Android 12L (API-Level 32) oder niedriger durch einen rotierten Signaturschlüssel signiert wurde, musst du --rotation-min-sdk-version 28 verwenden, um deine App weiterhin mit dem rotierten Signaturschlüssel für Android 9 (API-Level 28) zu signieren.

--v1-signing-enabled <true | false>
Bestimmt, ob apksigner das angegebene APK-Paket mit dem traditionellen, JAR-basierten Signaturschema signiert. Standardmäßig verwendet das Tool die Werte von --min-sdk-version und --max-sdk-version, um zu entscheiden, wann dieses Signaturschema angewendet wird.
--v2-signing-enabled <true | false>
Bestimmt, ob apksigner das angegebene APK-Paket mit dem APK-Signaturschema v2 signiert. Standardmäßig verwendet das Tool die Werte von --min-sdk-version und --max-sdk-version, um zu entscheiden, wann dieses Signaturschema angewendet wird.
--v3-signing-enabled <true | false>
Bestimmt, ob apksigner das angegebene APK-Paket mit dem APK-Signaturschema v3 signiert. Standardmäßig verwendet das Tool die Werte von --min-sdk-version und --max-sdk-version, um zu entscheiden, wann dieses Signaturschema angewendet wird.
--v4-signing-enabled <true | false | only>

Bestimmt, ob apksigner das angegebene APK-Paket mit dem APK-Signaturschema v4 signiert. Dieses Schema erzeugt eine Signatur in einer separaten Datei (apk-name.apk.idsig). Wenn true und das APK nicht signiert sind, wird basierend auf den Werten von --min-sdk-version und --max-sdk-version eine V2- oder V3-Signatur generiert. Der Befehl erzeugt dann die Datei .idsig basierend auf dem Inhalt des signierten APK.

Verwende only, um nur die V4-Signatur zu generieren, ohne das APK und alle Signaturen zu ändern, die vor dem Aufruf vorhanden waren. only schlägt fehl, wenn das APK noch keine V2- oder V3-Signatur hat oder wenn für die Signatur ein anderer Schlüssel als der für den aktuellen Aufruf bereitgestellte Schlüssel verwendet wurde.

Standardmäßig verwendet das Tool die Werte von --min-sdk-version und --max-sdk-version, um zu entscheiden, wann dieses Signaturschema angewendet wird.

-v, --verbose
Ausführliche Ausgabe verwenden.

Optionen pro Unterzeichner

Die folgenden Optionen geben die Konfiguration eines bestimmten Unterzeichners an. Diese Optionen sind nicht erforderlich, wenn Sie Ihre Anwendung nur mit einem Unterzeichner signieren.

--next-signer <signer-options>
Wird zum Angeben verschiedener allgemeiner Optionen für jeden Unterzeichner verwendet.
--v1-signer-name <basename>
Der Basisname für die Dateien, die in der JAR-basierten Signatur für den aktuellen Unterzeichner enthalten sind. Standardmäßig verwendet apksigner den Schlüsselalias des KeyStores oder den Basisnamen der Schlüsseldatei für diesen Unterzeichner.

Schlüssel- und Zertifikatsoptionen

Mit den folgenden Optionen werden der private Schlüssel und das Zertifikat des Unterzeichners angegeben:

--ks <filename>
Der private Schlüssel und die Zertifikatskette des Unterzeichners befinden sich in der angegebenen Java-basierten KeyStore-Datei. Wenn der Dateiname auf "NONE" gesetzt ist, muss für den KeyStore, der den Schlüssel und das Zertifikat enthält, keine Datei angegeben werden, was bei einigen PKCS #11-KeyStores der Fall ist.
--ks-key-alias <alias>
Der Name des Alias, der den privaten Schlüssel und die Zertifikatsdaten des Unterzeichners im KeyStore darstellt. Wenn der mit dem Unterzeichner verknüpfte KeyStore mehrere Schlüssel enthält, müssen Sie diese Option angeben.
--ks-pass <input-format>

Das Passwort für den KeyStore, der den privaten Schlüssel und das Zertifikat des Unterzeichners enthält. Sie müssen ein Passwort angeben, um einen Schlüsselspeicher zu öffnen. Das apksigner-Tool unterstützt folgende Formate:

  • pass:<password> – Passwort, das direkt im Befehl apksigner sign angegeben wird.
  • env:<name>: Das Passwort wird in der angegebenen Umgebungsvariablen gespeichert.
  • file:<filename>: Das Passwort wird in der angegebenen Datei in einer Zeile gespeichert.
  • stdin: Das Passwort wird in einer einzigen Zeile im Standardeingabestream angegeben. Das ist das Standardverhalten für --ks-pass.

Hinweis : Wenn eine Datei mehrere Passwörter enthält, geben Sie diese in separaten Zeilen an. Das apksigner-Tool ordnet Passwörter den Unterzeichnern eines APK in der Reihenfolge zu, in der Sie die Unterzeichner angeben. Wenn Sie für einen Unterzeichner zwei Passwörter angegeben haben, interpretiert apksigner das erste als KeyStore-Passwort und das zweite als Schlüsselpasswort.

--pass-encoding <charset>
Beinhaltet die angegebenen Zeichencodierungen, z. B. ibm437 oder utf-8, wenn versucht wird, Passwörter zu verarbeiten, die Nicht-ASCII-Zeichen enthalten.

Keytool verschlüsselt Schlüsselspeicher häufig, indem das Passwort mit dem Standardzeichensatz der Console konvertiert wird. Standardmäßig versucht apksigner, verschiedene Arten des Passworts zu entschlüsseln:

  • Die Unicode-Form
  • Das mit dem JVM-Standardzeichensatz codierte Formular
  • Unter Java 8 und älter das mit dem Standardzeichensatz der Konsole codierte Formular
  • Unter Java 9 kann apksigner den Zeichensatz der Konsole nicht erkennen. Möglicherweise müssen Sie --pass-encoding angeben, wenn ein Nicht-ASCII-Passwort verwendet wird. Möglicherweise müssen Sie diese Option auch mit Schlüsselspeichern angeben, die dieses Keytool auf einem anderen Betriebssystem oder in einer anderen Sprache erstellt haben.

    --key-pass <input-format>

    Das Passwort für den privaten Schlüssel des Unterzeichners, das erforderlich ist, wenn der private Schlüssel passwortgeschützt ist. Das apksigner-Tool unterstützt die folgenden Formate:

    • pass:<password>: Das Passwort wird inline mit dem Rest des apksigner sign-Befehls angegeben.
    • env:<name>: Das Passwort wird in der angegebenen Umgebungsvariablen gespeichert.
    • file:<filename>: Das Passwort wird in der angegebenen Datei in einer Zeile gespeichert.
    • stdin: Das Passwort wird in einer einzigen Zeile im Standardeingabestream angegeben. Das ist das Standardverhalten für --key-pass.
    --ks-type <algorithm>
    Der Typ oder Algorithmus, der dem KeyStore zugeordnet ist und den privaten Schlüssel und das Zertifikat des Unterzeichners enthält. Standardmäßig verwendet apksigner den Typ, der in der Datei mit den Sicherheitseigenschaften als keystore.type-Konstante definiert ist.
    --ks-provider-name <name>
    Der Name des JCA-Anbieters, der beim Anfordern der Schlüsselspeicherimplementierung des Unterzeichners verwendet werden soll. Standardmäßig verwendet apksigner den Anbieter mit der höchsten Priorität.
    --ks-provider-class <class-name>
    Der voll qualifizierte Klassenname des JCA-Anbieters, der beim Anfordern der KeyStore-Implementierung des Unterzeichners verwendet werden soll. Diese Option dient als Alternative für --ks-provider-name. Standardmäßig verwendet apksigner den mit der Option --ks-provider-name angegebenen Anbieter.
    --ks-provider-arg <value>
    Ein Stringwert, der als Argument für den Konstruktor der JCA-Anbieterklasse übergeben wird. Die Klasse selbst wird mit der Option --ks-provider-class definiert. Standardmäßig verwendet apksigner den Null-Argument-Konstruktor der Klasse.
    --key <filename>
    Der Name der Datei, die den privaten Schlüssel des Unterzeichners enthält. Diese Datei muss im PKCS #8-DER-Format verwendet werden. Wenn der Schlüssel passwortgeschützt ist, fordert apksigner das Passwort mit der Standardeingabe auf, sofern Sie nicht mit der Option --key-pass ein anderes Eingabeformat festlegen.
    --cert <filename>
    Der Name der Datei, die die Zertifikatskette des Unterzeichners enthält. Diese Datei muss im X.509-PEM- oder DER-Format vorliegen.

    Befehl überprüfen

    Der Befehl apksigner verify hat die folgenden Optionen.

    --print-certs
    Informationen zu den Signaturzertifikaten des APKs anzeigen.
    --min-sdk-version <integer>
    Das niedrigste Android-Framework-API-Level, das apksigner verwendet, um zu bestätigen, dass die APK-Signatur verifiziert wird. Höhere Werte ermöglichen dem Tool, beim Signieren der App stärkere Sicherheitsparameter zu verwenden. Dabei wird aber die Verfügbarkeit des APKs für Geräte mit neueren Android-Versionen eingeschränkt. Standardmäßig verwendet apksigner den Wert des Attributs minSdkVersion aus der Manifestdatei der App.
    --max-sdk-version <integer>
    Das höchste Android Framework API-Level, das apksigner verwendet, um zu bestätigen, dass die APK-Signatur verifiziert wird. Standardmäßig verwendet das Tool das höchstmögliche API-Level.
    -v, --verbose
    Ausführliche Ausgabe verwenden.
    -Werr
    Warnungen als Fehler behandeln.

    Beispiele

    In den folgenden Beispielen wird apksigner verwendet.

    APK signieren

    Signiere ein APK mit release.jks. Dies ist der einzige Schlüssel im KeyStore:

    $ apksigner sign --ks release.jks app.apk
    

    Signieren Sie ein APK mit einem privaten Schlüssel und einem Zertifikat, die als separate Dateien gespeichert sind:

    $ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
    

    Signieren Sie ein APK mit zwei Schlüsseln:

    $ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
    

    Signieren Sie ein APK mit einem rotierenden Signaturschlüssel und der Rotation, die auf SDK-Version 28 oder höher ausgerichtet ist:

    $ apksigner sign --ks release.jks --next-signer --ks release2.jks \
      --lineage /path/to/signing/history/lineage app.apk \
      --rotation-min-sdk-version 28
    

    Signieren Sie ein APK mit einem rotierenden Signaturschlüssel und der Rotation, die auf SDK-Version 33 oder höher ausgerichtet ist:

    $ apksigner sign --ks release.jks --next-signer --ks release2.jks \
      --lineage /path/to/signing/history/lineage app.apk
    

    Signatur eines APKs überprüfen

    Prüfe, ob die APK-Signaturen auf allen Android-Plattformen, die vom APK unterstützt werden, als gültig bestätigt werden müssen:

    $ apksigner verify app.apk
    

    Prüfe, ob die APK-Signaturen unter Android 4.0.3 (API-Level 15) und höher als gültig eingestuft werden:

    $ apksigner verify --min-sdk-version 15 app.apk
    

    Signaturschlüssel rotieren

    Aktivieren Sie eine Signaturzertifikat-Herkunft, die die Schlüsselrotation unterstützt:

    $ apksigner rotate --out /path/to/new/file --old-signer \
        --ks release.jks --new-signer --ks release2.jks

    Rotieren Sie Ihre Signaturschlüssel noch einmal:

    $ apksigner rotate --in /path/to/existing/lineage \
      --out /path/to/new/file --old-signer --ks release2.jks \
      --new-signer --ks release3.jks