L'outil apksigner
, disponible dans la version de révision 24.0.3 de SDK Build-Tools pour Android, vous permet de signer les fichiers APK et de confirmer que la signature d'un APK est validée avec succès sur toutes les versions d'Android de la plate-forme Android compatibles avec ce fichier APK.
Cette page propose un guide rapide d'utilisation de l'outil et sert de référence pour les différentes options de ligne de commande compatibles avec l'outil. Pour obtenir une description plus complète de la façon dont l'outil apksigner
est utilisé pour signer vos fichiers APK, consultez le guide Signer votre application.
Attention : Si vous signez le fichier APK à l'aide d'apksigner
et que vous y apportez des modifications supplémentaires, sa signature n'est plus valide.
Si vous utilisez zipalign
pour aligner votre fichier APK, utilisez-le avant de signer l'APK.
Utilisation
Signer un fichier APK
La syntaxe de signature d'un fichier APK à l'aide de l'outil apksigner
est la suivante :
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
Lorsque vous signez un fichier APK à l'aide de l'outil apksigner
, vous devez fournir la clé privée et le certificat du signataire. Vous pouvez inclure ces informations de deux façons :
-
Spécifiez un fichier KeyStore à l'aide de l'option
--ks
. -
Spécifiez le fichier de clé privée et le fichier de certificat séparément à l'aide des options
--key
et--cert
. Le fichier de clé privée doit utiliser le format PKCS #8 et le fichier de certificat le format X.509.
En général, vous signez un fichier APK avec un seul signataire. Si vous devez signer un fichier APK à l'aide de plusieurs signataires, utilisez l'option --next-signer
pour séparer l'ensemble des options générales à appliquer à chacun d'eux :
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
Vérifier la signature d'un fichier APK
Voici la syntaxe permettant de confirmer la validation de la signature d'un fichier APK sur les plates-formes compatibles :
apksigner verify [options] app-name.apk
Effectuer une rotation des clés de signature
Voici la syntaxe permettant d'effectuer la rotation d'une lignée de certificats de signature ou d'une nouvelle séquence de signatures :
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
Options
Les listes suivantes répertorient l'intégralité des options pour chaque commande compatible avec l'outil apksigner
.
Commande de signature
La commande de signature apksigner
propose les options suivantes.
Options générales
Les options suivantes spécifient les paramètres de base à appliquer à un signataire :
--out <apk-filename>
- Emplacement où vous souhaitez enregistrer le fichier APK signé. Si cette option n'est pas fournie explicitement, le package APK est signé sur place, ce qui remplace le fichier APK d'entrée.
--min-sdk-version <integer>
-
Niveau d'API du framework Android le plus bas utilisé par
apksigner
pour s'assurer que la signature du fichier APK sera vérifiée. Des valeurs plus élevées permettent à l'outil d'utiliser des paramètres de sécurité renforcée lors de la signature de l'application, mais limitent la disponibilité du fichier APK aux appareils exécutant des versions plus récentes d'Android. Par défaut,apksigner
utilise la valeur de l'attributminSdkVersion
du fichier manifeste de l'application. --max-sdk-version <integer>
- Niveau d'API du framework Android le plus élevé utilisé par
apksigner
pour s'assurer que la signature du fichier APK sera vérifiée. Par défaut, l'outil utilise le niveau d'API le plus élevé. --rotation-min-sdk-version <integer>
- Niveau d'API le plus bas que la clé de signature de l'APK avec rotation doit utiliser pour générer la signature de l'APK. La clé de signature d'origine (n'ayant fait l'objet d'aucune rotation) du fichier APK est utilisée pour toutes les versions de plate-forme précédentes. Par défaut, les clés de signature ayant subi une rotation, qui sont compatibles avec les appareils exécutant Android 13 (niveau d'API 33) ou version ultérieure, sont utilisées avec le bloc de signature v3.1.
--v1-signing-enabled <true | false>
- Détermine si
apksigner
signe le package APK donné à l'aide du schéma de signature traditionnel JAR. Par défaut, l'outil utilise les valeurs de--min-sdk-version
et--max-sdk-version
pour décider quand appliquer ce schéma de signature. --v2-signing-enabled <true | false>
- Détermine si
apksigner
signe le package APK donné à l'aide du schéma de signature des fichiers APK v2. Par défaut, l'outil utilise les valeurs de--min-sdk-version
et--max-sdk-version
pour décider quand appliquer ce schéma de signature. --v3-signing-enabled <true | false>
- Détermine si
apksigner
signe le package APK donné à l'aide du schéma de signature des fichiers APK v3. Par défaut, l'outil utilise les valeurs de--min-sdk-version
et--max-sdk-version
pour décider quand appliquer ce schéma de signature. --v4-signing-enabled <true | false | only>
-
Détermine si
apksigner
signe le package APK donné à l'aide du schéma de signature des fichiers APK v4. Ce schéma génère une signature dans un fichier distinct (apk-name.apk.idsig
). Sitrue
et l'APK ne sont pas signés, une signature v2 ou v3 est générée en fonction des valeurs de--min-sdk-version
et--max-sdk-version
. La commande génère ensuite le fichier.idsig
en fonction du contenu du fichier APK signé.Utilisez
only
pour générer uniquement la signature v4 sans modifier le fichier APK ni les signatures dont il disposait avant l'appel.only
échoue si le fichier APK ne dispose pas déjà d'une signature v2 ou v3, ou si la signature utilise une clé différente de celle fournie pour l'appel actuel.Par défaut, l'outil utilise les valeurs de
--min-sdk-version
et--max-sdk-version
pour décider quand appliquer ce schéma de signature. -v
,--verbose
- Utilisez le mode de sortie détaillé.
Remarque : Si votre application a été signée par une clé de signature ayant fait l'objet d'une rotation sur un appareil équipé d'Android 12L (niveau d'API 32) ou version antérieure, vous devez utiliser --rotation-min-sdk-version 28
pour continuer à signer votre application avec cette clé de signature pour Android 9 (niveau d'API 28).
Options par signataire
Les options suivantes spécifient la configuration d'un signataire particulier. Ces options ne sont pas nécessaires si vous signez votre application avec un seul signataire.
--next-signer <signer-options>
- Permet de spécifier différentes options générales pour chaque signataire.
--v1-signer-name <basename>
-
Nom de base des fichiers comprenant la signature basée sur JAR pour le signataire actuel. Par défaut,
apksigner
utilise l'alias de clé du keystore ou le nom de base du fichier de clé de ce signataire.
Options de clé et de certificat
Les options suivantes spécifient la clé privée et le certificat du signataire :
--ks <filename>
- La clé privée et la chaîne de certificats du signataire résident dans le fichier keystore Java donné. Si le nom de fichier est défini sur
"NONE"
, il n'est pas nécessaire de spécifier un fichier pour le keystore contenant la clé et le certificat, ce qui est le cas de certains keystores PKCS #11. --ks-key-alias <alias>
- Nom de l'alias qui représente les données de clé privée et de certificat du signataire dans le keystore. Si le keystore associé au signataire contient plusieurs clés, vous devez spécifier cette option.
--ks-pass <input-format>
-
Mot de passe du keystore contenant la clé privée et le certificat du signataire. Vous devez fournir un mot de passe pour ouvrir un keystore. L'outil
apksigner
accepte les formats suivants :-
pass:<password>
: mot de passe fourni avec le reste de la commandeapksigner sign
. -
env:<name>
: mot de passe stocké dans la variable d'environnement donnée. -
file:<filename>
: mot de passe stocké sur une seule ligne dans le fichier donné. -
stdin
: mot de passe fourni sur une seule ligne dans le flux d'entrée standard. Il s'agit du comportement par défaut pour--ks-pass
.
Remarque : Si vous incluez plusieurs mots de passe dans le même fichier, saisissez-les sur des lignes distinctes. L'outil
apksigner
associe les mots de passe aux signataires d'un fichier APK en fonction de l'ordre dans lequel vous les spécifiez. Si vous avez fourni deux mots de passe pour un signataire,apksigner
interprète le premier mot de passe comme le mot de passe du keystore et le second comme mot de passe de la clé. -
--pass-encoding <charset>
-
Inclut les encodages des caractères spécifiés (tels que
ibm437
ouutf-8
) lorsque vous essayez de gérer des mots de passe contenant des caractères non ASCII.L'utilitaire keytool chiffre souvent les keystores en convertissant le mot de passe à l'aide du charset par défaut de la console. Par défaut,
apksigner
tente de déchiffrer les données à l'aide de plusieurs formats de mot de passe :- Format Unicode
- Format encodé à l'aide du jeu de caractères par défaut de la JVM
- Format encodé à l'aide du charset par défaut de la console (sur Java 8 et les versions antérieures)
Sous Java 9,
apksigner
n'est pas en mesure de détecter le charset de la console. Dès lors, vous serez peut-être amené à spécifier--pass-encoding
lorsqu'un mot de passe non ASCII est utilisé. Vous devrez peut-être également spécifier cette option avec les keystores créés par l'utilitaire keytool dans un système d'exploitation ou des paramètres régionaux différents. --key-pass <input-format>
-
Mot de passe de la clé privée du signataire, qui est nécessaire si la clé privée est protégée par un mot de passe. L'outil
apksigner
accepte les formats suivants :-
pass:<password>
: mot de passe fourni avec le reste de la commandeapksigner sign
. -
env:<name>
: mot de passe stocké dans la variable d'environnement donnée. -
file:<filename>
: mot de passe stocké sur une seule ligne dans le fichier donné. -
stdin
: mot de passe fourni sur une seule ligne dans le flux d'entrée standard. Il s'agit du comportement par défaut pour--key-pass
.
-
--ks-type <algorithm>
-
Type ou algorithme associé au keystore contenant la clé privée et le certificat du signataire. Par défaut,
apksigner
utilise le type défini comme constantekeystore.type
dans le fichier de propriétés de sécurité. --ks-provider-name <name>
- Nom du fournisseur JCA à utiliser lorsque vous demandez l'implémentation du keystore du signataire. Par défaut,
apksigner
utilise le fournisseur doté de la priorité la plus élevée. --ks-provider-class <class-name>
-
Nom de classe complet du fournisseur JCA à utiliser lorsque vous demandez l'implémentation du keystore du signataire. Cette option sert d'alternative à
--ks-provider-name
. Par défaut,apksigner
utilise le fournisseur spécifié avec l'option--ks-provider-name
. --ks-provider-arg <value>
-
Valeur de chaîne à transmettre en tant qu'argument pour le constructeur de la classe JCA du fournisseur. La classe, quant à elle, est définie avec l'option
--ks-provider-class
. Par défaut,apksigner
utilise le constructeur d'argument 0 de la classe. --key <filename>
-
Nom du fichier contenant la clé privée du signataire. Ce fichier doit utiliser le format DER PKCS #8. Si la clé est protégée par un mot de passe,
apksigner
demande le mot de passe à l'aide d'une entrée standard, sauf si vous spécifiez un autre type de format d'entrée à l'aide de l'option--key-pass
. --cert <filename>
- Nom du fichier contenant la chaîne de certificats du signataire. Ce fichier doit utiliser le format PEM ou DER X.509.
Commande de validation
La commande de validation apksigner
propose les options suivantes.
--print-certs
- Affiche les informations sur les certificats de signature du fichier APK
--min-sdk-version <integer>
-
Niveau d'API du framework Android le plus bas utilisé par
apksigner
pour s'assurer que la signature du fichier APK sera vérifiée. Des valeurs plus élevées permettent à l'outil d'utiliser des paramètres de sécurité renforcée lors de la signature de l'application, mais limitent la disponibilité du fichier APK aux appareils exécutant des versions plus récentes d'Android. Par défaut,apksigner
utilise la valeur de l'attributminSdkVersion
du fichier manifeste de l'application. --max-sdk-version <integer>
- Niveau d'API du framework Android le plus élevé utilisé par
apksigner
pour s'assurer que la signature du fichier APK sera vérifiée. Par défaut, l'outil utilise le niveau d'API le plus élevé. -v
,--verbose
- Utilisez le mode de sortie détaillé.
-Werr
- Traitez les avertissements comme des erreurs.
Exemples
Voici des exemples utilisant apksigner
.
Signer un fichier APK
Signez un fichier APK à l'aide de release.jks
, qui est la seule clé du keystore :
$ apksigner sign --ks release.jks app.apk
Signez un fichier APK à l'aide d'une clé privée et d'un certificat, stockés dans des fichiers distincts :
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Signez un fichier APK à l'aide de deux clés :
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
Signez un fichier APK avec une clé de signature ayant fait l'objet d'une rotation et la rotation ciblant la version de SDK 28 (ou version ultérieure) :
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
Signez un fichier APK avec une clé de signature ayant fait l'objet d'une rotation et la rotation ciblant la version de SDK 33+ :
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
Vérifier la signature d'un fichier APK
Vérifiez si la validité des signatures du fichier APK doit être confirmée sur toutes les plates-formes Android compatibles avec le fichier APK :
$ apksigner verify app.apk
Vérifiez si la validité des signatures du fichier APK doit être confirmée sur Android 4.0.3 (niveau d'API 15) ou version ultérieure :
$ apksigner verify --min-sdk-version 15 app.apk
Effectuer une rotation des clés de signature
Activez une lignée de certificats de signature compatible avec la rotation des clés :
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
Effectuez une nouvelle rotation de vos clés de signature :
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks