Développement Android : Signer manuellement les fichiers APK

Par gabs - Le 15/07/14 - Affichages : 20243
Il existe une multitude d'outils pour signer des APKs mais je vais vous donner une méthode très basique qui va vous permettre de bien comprendre le principe mais aussi d'utiliser votre propre signature.
droid.png

Pourquoi signer les APKs ?

Les applications (les fichiers APK) ont besoins d'être signées numériquement afin de pouvoir facilement être installées sur un système Android.
La signature permet entre autres :
- de garantir l'intégrité de l'APK
- d'identifier l'auteur
- de garantir la sécurité lors des mises à jours d'applications (vérification que l'application est bien du même auteur, sinon refus de mise à jour)
- d'autoriser certaines interactions entre des applications signées par la même clé.


Où est la signature ?

Pour ceux qui ne le sauraient pas encore, un fichier apk est en fait une archive compressée que l'on peut lire avec divers outils comme par exemple 7-Zip
La signature se trouve au sein de l'archive, dans un répertoire nommé WEB-INF
Ce répertoire contient la signature elle-même mais aussi le certificat contenant diverses information sur l'auteur de l'application.
Il est donc tout a fait possible de re-signer un APK en supprimant ce répertoire et en re-signant l’application avec sa propre signature.


Pourquoi utiliser sa propre clé ?

De nombreux outils permettent de signer des APKs, mais la plupart du temps, ils utilisent une signature générique, inclue dans l'outil lui-même. Le problème est qu'une multitude d'applications risquent d'utiliser cette même signature, y compris des applications malveillantes. Du coup des logiciels de sécurité comme Lockout pourront alors classer votre application dans les "riskwares" comme cela a été le cas pour mon port de l'appareil photo kitkat.
Un autre problème est que le fait d'avoir une même signature entre deux applications permet apparemment un certain niveau d'interaction entre elles. C'est là encore un risque en terme de sécurité.
Du coup, il préférable d'utiliser sa propre signature. ;)


Passons à la pratique

Pré-requis :
- 7-Zip
- l'APK à signer
- le JDK (choisissez bien Java SE Development Kit)


1- Création d'un jeu de clés

Cette opération est à réaliser une fois afin de créer votre certificat et votre jeu de clés que vous pourrez ensuite ré-utiliser autant de fois que nécessaire.
Après avoir installé le JDK (dans mon cas le jdk-8u5-windows-x64), vous pouvez le rajouter dans le PATH (pour moi : C:\Program Files\Java\jdk1.8.0_05\bin )

Nous allons donc créer une clé nommé "ma_cle" dans un magasin nommé "keystore.jks" et protégé par le mot de passe "mot_de_passe_store"
Lancez une invite de commande "cmd" et positionnez vous dans le répertoire de travail de votre choix
Code: Select All Code
keytool -genkeypair -v  -keystore keystore.jks -storepass mot_de_passe_store -alias ma_cle -keyalg RSA -validity 36500

Renseignez les informations demandées (au moins le nom) et répondez "oui" à la dernière question lorsque le résumé de ce que vous avez saisi est affiché.
A la question concernant le mot de passe de la clé, faites juste Entrée pour ré-utiliser le mot de passe du keystore.
Dans le cas présent le message « [Stockage de keystore.jks] » indique la réussite de l’opération et le fichier nommé keystore.jks a été créé dans le répertoire courant.


2- Signature de l'APK

Copiez l'APK à signer dans le répertoire contenant le fichier keystore.jks précédemment créé.
Ouvrez l'APK avec 7-Zip est assurez-vous que l'APK ne contient pas de répertoire META-INF. S'il y en a un, c'est que l'APK contient probablement déjà une signature, il faut donc supprimer ce répertoire. Fermez ensuite 7-Zip.

Dans notre exemple nous allons donc signer une application (ici Tapatalk) avec notre clé
Code: Select All Code
jarsigner -keystore keystore.jks -storepass mot_de_passe_store Tapatalk_4.6.2.apk ma_cle

En réponse, on doit obtenir "jar signed."

Si on ouvre l'archive avec 7-Zip on va voir le répertoire META-INF avec les fichiers de signature :
Signature.PNG

Voilà, c'est terminé et l'application peut maintenant être déployée sans problème. ;-)

Pour faire suite aux remarques de Franck_29 et de Kris92fr, et pour ceux qui veulent en savoir un peu plus sur l'utilisation des signatures, j'ai complété ce sujet un peu plus loin dans ce topic. ;)
26 réponse(s) -