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 verwendetapksigner
den Wert des AttributsminSdkVersion
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.
--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
). Wenntrue
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.
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.
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 Befehlapksigner 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, interpretiertapksigner
das erste als KeyStore-Passwort und das zweite als Schlüsselpasswort. -
--pass-encoding <charset>
-
Beinhaltet die angegebenen Zeichencodierungen, z. B.
ibm437
oderutf-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 desapksigner 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 alskeystore.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 verwendetapksigner
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 verwendetapksigner
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 verwendetapksigner
den Wert des AttributsminSdkVersion
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