Code Signing — qu'est-ce que c'est, signature de code et comment ça fonctionne

Auteur : IT Sectr Publié le : 2026-04-16 Temps de lecture : 9 min

Code Signing (signature de code) est un mécanisme de signature numérique pour les fichiers exécutables qui garantit l'authenticité du développeur et l'intégrité de l'application. Sous Android, chaque fichier APK doit être signé avec un certificat avant l'installation sur un appareil ou la publication sur Google Play. Selon Google, 2024, Android prend en charge quatre générations de schémas de signature : du v1 basé sur JAR au v4 pour l'installation en streaming.

Points clés

  • Code Signing — signature numérique du code confirmant la paternité et l'intégrité de l'application.
  • Sous Android, la signature s'effectue via un keystore — un référentiel de clés et de certificats.
  • Le schéma v2 (APK Signature Scheme) est le standard principal depuis Android 7.0, protégeant tous les octets de l'APK.
  • La rotation des clés (v3, Android 9.0+) permet de changer la clé de signature sans supprimer l'application.
  • Google Play utilise Play App Signing pour la gestion centralisée des clés.

Qu'est-ce que le Code Signing ?

Code Signing est un processus cryptographique dans lequel le développeur signe le code exécutable avec son certificat numérique. La signature est créée à l'aide du chiffrement asymétrique : la clé privée du développeur génère une signature numérique, et la clé publique est intégrée dans le certificat. N'importe qui peut vérifier la signature en utilisant la clé publique, mais modifier le code sans casser la signature est impossible.

Dans le développement mobile, la signature de code remplit trois fonctions. Première — l'authentification : l'utilisateur et la plateforme peuvent identifier le développeur de l'application. Deuxième — l'intégrité : toute modification de l'APK après la signature invalide la signature. Troisième — la mise à jour de confiance : la plateforme permet uniquement de mettre à jour une application avec des APKs signés avec le même certificat que la version installée.

Statut juridique

La signature numérique des applications Android a une importance juridique. Selon la législation russe (63-FZ) et le règlement européen eIDAS, une signature électronique qualifiée équivaut à une signature manuscrite. Cependant, signer un APK avec un certificat auto-signé (pratique courante sous Android) n'est pas qualifié — il confirme l'intégrité, mais pas l'identité du développeur d'un point de vue juridique.

Schémas de signature Android : v1, v2, v3, v4

Android prend en charge quatre schémas de signature APK, chacun résolvant les problèmes de la version précédente et ajoutant de nouvelles capacités. Tous les schémas peuvent coexister dans un même APK — c'est nécessaire pour la rétrocompatibilité avec les anciennes versions d'Android.

Le schéma v1 (JAR signing) est apparu dans Android 1.0. Il signe des fichiers individuels dans l'archive APK à l'aide d'entrées dans META-INF/MANIFEST.MF. L'inconvénient : un attaquant peut modifier l'APK (ajouter ou supprimer des fichiers) et ne resigner que les fichiers modifiés sans toucher au reste. Cela rend v1 vulnérable à certaines attaques. Le schéma v2 (APK Signature Scheme), introduit dans Android 7.0, signe l'intégralité du fichier APK dans son ensemble, y compris tous les octets sauf la signature elle-même, éliminant ainsi la possibilité de modification sélective.

SchémaAndroidCaractéristiqueRotation de clé
v1 (JAR)1.0+Signature par fichierNon
v27.0+Signature complète de l'APKNon
v39.0+Signature + rotationOui
v411.0+Streaming + ADBOui

v3 : rotation de la clé de signature

Le schéma v3, introduit dans Android 9.0, résout un problème ancien : que faire si la clé de signature est compromise ou a expiré ? Auparavant, changer la clé de signature signifiait que l'application était traitée comme nouvelle — elle ne pouvait pas être installée par-dessus une application existante. v3 ajoute un mécanisme de rotation : l'APK peut inclure une preuve de rotation (proof-of-rotation), signée par l'ancienne clé. Le système vérifie la chaîne et permet la mise à jour de l'application signée avec la nouvelle clé.

Keystore et certificats

Keystore est un conteneur sécurisé contenant les clés privées et les certificats pour signer les applications. Dans le développement Android, on utilise le format JKS (Java KeyStore) ou PKCS12. Le keystore est créé avec l'utilitaire keytool, qui fait partie du JDK. Chaque clé dans le référentiel est identifiée par un alias et protégée par un mot de passe.

Le certificat dans un keystore contient la clé publique et les informations du propriétaire : nom de l'organisation, pays, période de validité. Pour les applications Android, le certificat peut être auto-signé — Google n'exige pas d'autorité de certification (CA), ce qui distingue Android d'iOS. Cependant, la validité du certificat doit être d'au moins 25 ans, car l'application sera mise à jour avec la même clé.

bash
# Création d'un nouveau keystore pour la signature
keytool -genkey -v -keystore my-release.keystore \
        -alias my-app-alias \
        -keyalg RSA \
        -keysize 2048 \
        -validity 10000

# Affichage du contenu du keystore
keytool -list -v -keystore my-release.keystore

Formats de clé

Android prend en charge deux algorithmes pour les clés de signature : RSA et ECDSA. RSA avec une taille de clé de 2048 bits est le standard de facto, pris en charge par toutes les versions d'Android. ECDSA (algorithme de signature numérique à courbe elliptique) avec la courbe P-256 offre la même force cryptographique avec une taille de clé plus petite. Depuis Android 9.0, ECDSA est recommandé car il est plus rapide lors de la vérification sur les appareils mobiles.

Configuration de la signature dans la compilation

Dans le Android Gradle Plugin, la signature est configurée via le bloc signingConfigs dans le build.gradle au niveau du module. Pour les compilations de débogage, Android Studio crée automatiquement un keystore de débogage avec des mots de passe connus. Pour les compilations de release, le développeur spécifie le chemin vers son keystore, l'alias de la clé et les mots de passe. Il est recommandé de stocker les mots de passe dans des fichiers de configuration séparés, exclus du contrôle de version.

Une pratique moderne est la gestion centralisée de la signature via CI/CD. Jenkins, GitLab CI ou GitHub Actions peuvent stocker le keystore comme un artefact protégé et les mots de passe comme des secrets d'environnement. Cela empêche la fuite de clés via le référentiel et simplifie la rotation des clés si nécessaire.

groovy
// build.gradle (niveau app) — configuration de la signature
android {
    signingConfigs {
        release {
            storeFile file("my-release.keystore")
            storePassword System.getenv("KEYSTORE_PASSWORD")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASSWORD")
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

Signature multi-schémas

Pour une compatibilité maximale, un APK doit être signé avec les trois schémas (v1 + v2 + v3). Android Gradle Plugin inclut tous les schémas par défaut. Les APKs signés uniquement avec v2 ne s'installeront pas sur Android 6.0 et versions antérieures. Les APKs avec seulement v1 n'obtiendront pas les avantages d'intégrité de v2 sur Android 7.0+. Inclure tous les schémas n'augmente pas la taille de l'APK de plus de 1 à 2 % et garantit la compatibilité avec tout appareil.

Play App Signing et gestion des clés

Play App Signing est un service Google Play qui gère centralisément les clés de signature des applications. Le développeur télécharge un APK signé avec une clé de téléchargement (upload key) dans Google Play Console, et Google Play le resigné avec une clé de distribution (distribution key) avant de le livrer aux utilisateurs. Cela protège la clé de distribution contre la perte ou le compromis.

Avantages de Play App Signing : sécurité — la clé de distribution est stockée dans le stockage sécurisé de Google ; rotation — un changement de clé peut être demandé via la console ; récupération — si la clé de téléchargement est perdue, une nouvelle peut être générée. Inconvénient : pour les applications qui existaient avant l'introduction de Play App Signing, la migration nécessite la création d'une nouvelle application, car l'ancienne clé de distribution est déjà utilisée.

bash
# Obtention de l'empreinte du certificat (SHA-256)
keytool -list -v -keystore my-release.keystore \
        -alias my-app-alias | grep "SHA256"

# Vérification de la signature APK avec apksigner
apksigner verify --verbose app-release.apk

Récupération de clé

Si la clé de signature est perdue et que Play App Signing n'est pas utilisé, il est impossible de restaurer la capacité de mettre à jour l'application — il faudra créer une nouvelle application avec un nouveau nom de package. C'est l'une des principales raisons d'utiliser Play App Signing. Google recommande de conserver une copie de sauvegarde du keystore dans un stockage hors ligne sécurisé (clé USB cryptée, coffre bancaire).

Vérification de la signature sur l'appareil

Lors de l'installation d'un APK, Android effectue une vérification de signature en plusieurs étapes. Première — vérification du certificat : si la validité a expiré et le format est correct. Deuxième — vérification de la signature : si la signature cryptographique correspond au contenu de l'APK. Troisième — comparaison du certificat avec la version installée : si l'application existe déjà sur l'appareil, le certificat doit correspondre, sinon l'installation est bloquée.

Le système de vérification est intégré dans le PackageManagerService. Lors du traitement d'une demande d'installation, PMS extrait la signature de l'APK, la vérifie à l'aide de la classe android.util.PackageParser et la compare avec la signature stockée de l'application installée (si elle existe). En cas de non-correspondance, l'utilisateur reçoit l'erreur « INSTALL_FAILED_UPDATE_INCOMPATIBLE ». Ce mécanisme empêche les attaques par substitution (un logiciel malveillant ne peut pas remplacer une application légitime par sa propre version).

Vérification par le développeur

Un développeur peut vérifier indépendamment la signature de l'APK à l'aide de l'utilitaire apksigner des Android SDK Build Tools. La commande apksigner verify --verbose app.apk montre avec quels schémas l'APK est signé, si les certificats sont valides et si les signatures correspondent au contenu. Pour la vérification programmatique de la signature d'une application installée, on utilise PackageManager.getPackageInfo() avec le flag GET_SIGNATURES.

kotlin
// Vérification programmatique de la signature d'une application installée
fun getAppSignature(context: Context, packageName: String): String? {
    val pm = context.packageManager
    val info = pm.getPackageInfo(
        packageName,
        PackageManager.GET_SIGNATURES
    )
    return info.signatures?.firstOrNull()?.toCharsString()
}

Meilleures pratiques de sécurité de la signature

La sécurité de la clé de signature est un aspect critique du développement Android. Le compromis de la clé permet à un attaquant de signer les mises à jour de votre application avec son propre code. Les règles principales : ne stockez jamais la clé dans un référentiel, n'utilisez pas une même clé pour différentes applications, ne transférez pas la clé par des canaux non sécurisés (courriel, messageries).

La pratique recommandée est la séparation des clés. Utilisez une clé distincte pour chaque application et une clé distincte pour le téléchargement vers Google Play (upload key). Pour les compilations de débogage, Android Studio crée un debug.keystore partagé — il ne doit pas être utilisé pour les compilations de release. La validité du certificat doit être de 25 à 30 ans (standard actuel, confirmé par Google).

PratiqueRecommandation
Stockage de la cléSupport crypté, secrets CI/CD
Validité du certificatAu moins 25 ans
AlgorithmeRSA 2048+ ou ECDSA P-256
SéparationClé distincte par application
SauvegardeCopie hors ligne du keystore

Audit des signatures

Vérifiez régulièrement l'intégrité de la chaîne de signature. Lorsque des employés ayant accès aux clés quittent l'entreprise, mettez à jour la clé de téléchargement via Google Play Console. Utilisez des outils comme Google Play Integrity API pour vérifier que votre application n'a pas été falsifiée sur les appareils des utilisateurs. L'API renvoie des données sur la signature et l'intégrité, les envoyant au serveur pour vérification.

Questions fréquentes

Qu'est-ce que le Code Signing sous Android ?

Code Signing est une signature numérique d'un fichier APK qui confirme que l'application a été créée par un développeur spécifique et n'a pas été modifiée après la signature. Sans signature, l'APK ne s'installera pas sur un appareil.

Comment créer une clé pour signer une application Android ?

Utilisez l'utilitaire keytool du JDK : keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. Spécifiez le keystore résultant dans build.gradle dans le bloc signingConfigs.

Que se passe-t-il si je perds la clé de signature ?

Si la clé est perdue et que vous n'utilisez pas Play App Signing, la mise à jour de l'application devient impossible. Vous devrez créer une nouvelle application sur Google Play avec un nouveau nom de package. Utilisez Play App Signing pour vous protéger contre la perte de clé.

Quelle est la différence entre les schémas de signature v1 et v2 ?

v1 signe chaque fichier dans l'APK individuellement — un attaquant peut modifier un fichier et ne resigner que celui-ci. v2 signe l'APK entier dans son ensemble — toute modification invalide la signature, offrant un niveau de sécurité plus élevé.

Qu'est-ce que Play App Signing ?

Play App Signing est un service Google Play qui stocke centralisément la clé de distribution des applications. Le développeur télécharge un APK signé avec une clé de téléchargement, et Google le resigné avant de le livrer aux utilisateurs, protégeant la clé contre la perte ou le vol.

Résumé

  • Code Signing est une signature numérique obligatoire pour les APKs, garantissant l'authenticité et l'intégrité de l'application.
  • Android prend en charge quatre schémas de signature : v1 (JAR), v2 (APK Signature), v3 (rotation de clés) et v4 (streaming).
  • Keystore est un conteneur sécurisé de clés créé via keytool avec l'algorithme RSA 2048+.
  • La rotation de clés (v3, Android 9.0+) permet de changer la clé de signature sans supprimer l'application.
  • Play App Signing gère centralisément les clés de distribution via Google Play Console.
  • La vérification de la signature lors de l'installation bloque les attaques par substitution : non-correspondance du certificat = erreur INSTALL_FAILED.
  • Sécurité de la clé : clé distincte par application, validité de 25+ ans, copie hors ligne, aucune clé dans le référentiel.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi