apksigner - Android-APKs signieren und verifizieren
apksigner [options] apk
apksigner --version
apksigner --help
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.
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
Ausführlicher Ausgabemodus
Hilfe zu diesem Befehl anzeigen und beenden
Behandeln Sie Warnungen als Fehler
signSignieren Sie die bereitgestellte APK
Datei, in die das signierte APK ausgegeben werden soll. Standardmäßig wird das APK direkt signiert und überschreibt die Eingabedatei.
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.
Höchste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der höchstmögliche Wert verwendet.
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).
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 optionsDiese Optionen geben die Konfiguration eines bestimmten Unterzeichners an. Um die Optionen verschiedener Unterzeichner abzugrenzen, verwenden Sie --next-signer.
Begrenzt die Optionen zweier verschiedener Unterzeichner. Es besteht keine Notwendigkeit, diese Option zu verwenden, wenn nur ein Unterzeichner verwendet wird.
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 optionsEs 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).
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.
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.
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.
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.
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.
Typ/Algorithmus des zu verwendenden KeyStores. Standardmäßig wird der Standardtyp verwendet.
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.
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.
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.
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.
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
Informationen zu den Signaturzertifikaten der APK anzeigen
Niedrigste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der Wert aus AndroidManifest.xml verwendet.
Höchste API-Ebene, auf der die Signaturen dieser APK überprüft werden. Standardmäßig wird der höchstmögliche Wert verwendet.
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
signSignieren Sie eine APK mit dem einzigen Schlüssel in keystore release.jks:
apksigner sign --ks release.jks app.apk
Signieren Sie eine APK mit einem privaten Schlüssel und einem Zertifikat, die als einzelne Dateien gespeichert sind:
apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Signieren Sie eine APK mit zwei Schlüsseln:
apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verifyPrüfen Sie, ob die Signaturen der APK auf allen Android-Plattformen überprüft werden sollen, die von dieser APK unterstützt werden:
apksigner verify app.apk
Prüfen Sie, ob die Signaturen der APK auf Android-Plattformen mit API Level 15 und höher überprüft werden sollen:
apksigner verify --min-sdk-version 15 app.apk
lineageEntfernen Sie alle Funktionen von einem vorherigen Unterzeichner in der Linie:
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
Zeigen Sie Details zu den Signaturzertifikaten und ihren Funktionen in der Linie an:
apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotateErstellen Sie eine neue SigningCertificateLineage, um die Rotation zu aktivieren:
apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
Erweitern Sie eine vorhandene SigningCertificateLineage, um sie nach der vorherigen Rotation erneut zu rotieren:
apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
Erstellen Sie eine neue SigningCertificateLineage mit expliziten Funktionen für den vorherigen Unterzeichner:
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
Das Android Open Source-Projekt.