Aller au contenu principal

Vérification de signature : sécuriser les mises à jour en 2026

Découvrez comment la vérification de signature protège les mises à jour Capacitor et Electron, en abordant les principes cryptographiques et l’intégration CI/CD.

Vérification de signature : sécuriser les mises à jour en 2026

Votre pipeline de mise à jour est au vert, le bundle est disponible sur l’edge et les appareils le recherchent. Puis quelqu’un repère une modification suspecte dans le JavaScript généré. Un runner de build compromis, une identifiante de développeur volée ou un artefact altéré a peut-être glissé une charge malveillante dans la release après la fin des tests. Sans la vérification de signature, le client n’a aucun moyen fiable de distinguer le bundle compilé par votre équipe d’un bundle modifié par un attaquant en transit ou au niveau de la couche de livraison.

Les mises à jour signées changent cette donne. L’appareil vérifie le bundle par rapport à une clé publique de confiance avant de remplacer le code actuellement en cours d’exécution. Si la signature ne correspond pas, la mise à jour reste inactive. Cela semble simple, mais les pannes en production surviennent généralement autour de la cryptographie, pas à l’intérieur. Les équipes perdent le fil de la rotation des clés, signent le mauvais artefact, appliquent un fichier en cache non vérifié ou collectent si peu de télémétrie qu’elles ne peuvent pas expliquer quels appareils ont rejeté une mise à jour.

Les sections ci-dessous se concentrent sur ces aspects opérationnels, du modèle de confiance et du flux de vérification aux contrôles CI/CD, à la réponse aux incidents et aux limites qu’une signature ne résout pas à elle seule.

Table des matières

Pourquoi la vérification de signature évite les mises à jour catastrophiques

Le pipeline CI/CD d’un plugin Capacitor populaire est compromis en fin de release. L’attaquant modifie le bundle live update, ajoute du code qui lit les données de l’application et publie l’artefact via le chemin de livraison normal du pipeline. Les appareils ne voient pas de domaine de téléchargement inconnu. Ils voient une mise à jour valide en attente d’installation.

Sans vérification cryptographique côté client, l’app peut télécharger et exécuter le bundle modifié dès que sa politique de mise à jour le permet. L’impact potentiel inclut l’exfiltration de données, le vol d’identifiants, l’altération des flux de paiement et la manipulation silencieuse de la logique métier. L’enquête est aussi pénible. Les ingénieurs doivent déterminer quel artefact a été servi, quels canaux l’ont reçu, quels appareils l’ont téléchargé, quels appareils l’ont appliqué, et si le code malveillant s’est exécuté avant le retrait de la release.

Un schéma illustrant comment la vérification de signature bloque les injections malveillantes de code dans un pipeline de livraison de mises à jour.

Une équipe ayant activé la vérification de signature rencontre un mode d’échec différent. L’application télécharge le même bundle empoisonné, calcule le digest attendu et vérifie la signature jointe par rapport à sa clé de confiance. La vérification cryptographique échoue, le mécanisme de mise à jour refuse d’activer le bundle, et un événement parvient à l’équipe sécurité avant que la nouvelle code ne soit exécutée.

Règle de production : Considérez une mise à jour comme hostile tant que l’appareil n’a pas vérifié son identité et ses octets exacts.

La protection ne fonctionne que si le vérificateur s’exécute sur l’appareil, avant l’extraction ou l’activation, et si la clé de confiance ne peut pas être remplacée par la mise à jour elle-même. Cela rend la gestion des certificats et des clés partie intégrante de la conception de la mise à jour, et non un détail administratif. Les équipes utilisant Capacitor doivent documenter cette frontière aux côtés de leur processus de gestion des certificats, y compris qui peut signer, où sont stockées les clés et comment un client prend connaissance d’une clé successorale autorisée.

La recherche moderne a traité la vérification de signature comme une discipline d’ingénierie mesurable depuis des décennies. Les premières études publiées sur la vérification de signature hors ligne et en ligne sont apparues en 1977, et des travaux ultérieurs se sont étendus à des méthodes incluant HMM et FFT. Une comparaison largement citée rapportait que les experts humains atteignaient environ 0,5 % de fausses acceptations et 7 % de faux rejets, tandis que les non-initiés atteignaient 6,5 % de fausses acceptations et 26 % de faux rejets, comme récapitulé dans cet historique de la recherche sur la vérification des signatures. Ces chiffres concernent les signatures manuscrites, et non les mises à jour logicielles, mais ils renforcent un point utile : la qualité de la vérification dépend du vérificateur, de ses données de référence et de sa politique de décision.

Comment la signature cryptographique crée la confiance

Considérez un bundle de release comme une enveloppe scellée. Le système de build calcule un digest des octets exacts et utilise une clé privée pour créer une signature numérique sur ce digest. L’application contient, ou reçoit de manière sécurisée, la clé publique, qui agit comme le sceau connu sur l’enveloppe. Si un attaquant modifie même une petite partie du bundle, l’application calcule un digest différent et la signature ne se valide plus.

Un schéma illustrant le processus de signature cryptographique, de la création de la signature par le développeur à la vérification par l’application mobile.

Le flux comporte quatre éléments distincts :

  1. Hachage transforme le bundle en un digest de longueur fixe. SHA-256 et SHA-512 sont des choix courants pour cette étape d’intégrité.
  2. Génération de clé crée une paire asymétrique. La clé privée signe, et la clé publique vérifie.
  3. Signature associe le digest aux métadonnées de la release, idéalement en incluant la version, le canal, la plateforme et l’audience.
  4. Vérification recalcule le digest à partir des octets téléchargés et vérifie que la signature a été produite par la clé privée de confiance.

Le vérificateur doit associer la signature à la même charge utile que celle que le metteur à jour appliquera. Une signature sur un manifeste ne suffit pas si l’application télécharge ensuite un bundle sans vérifier que l’empreinte du manifeste correspond au bundle. De même, vérifier l’empreinte d’un bundle n’établit pas qui l’a autorisé, à moins que l’empreinte elle-même ne soit authentifiée.

Choisir des algorithmes pour la livraison mobile

RSA reste familier et largement pris en charge, mais il nécessite généralement des clés plus volumineuses et un choix soigné du padding. Pour les nouveaux protocoles de mise à jour mobile, Ed25519 est souvent attractif car ses clés et signatures sont compactes et son chemin de vérification est efficace sur les processeurs mobiles. RSA-PSS peut également être approprié lorsque les exigences de compatibilité imposent l’usage de RSA. Le choix doit suivre la bibliothèque crypto de la plateforme, le matériel pris en charge, les exigences d’interopérabilité et le plan de migration, et non un benchmark copié d’un autre environnement.

Une introduction indépendante utile est ce guide sur la compréhension des signatures cryptographiques pour la blockchain. Le contexte des transactions diffère de la livraison OTA, mais l’explication de l’autorisation par clé privée et de la vérification par clé publique s’applique directement.

Chaînes de confiance et clés épinglées

Une chaîne de certificats délègue la confiance depuis une racine, via des autorités intermédiaires, jusqu'à un certificat feuille. Ce modèle peut simplifier des opérations PKI à grande échelle, mais le client de mise à jour d'une application a souvent un besoin plus restreint : faire confiance uniquement à la clé de l'éditeur qui a autorisé cette mise à jour. Intégrer une clé publique, ou un petit ensemble de clés autorisées, directement dans le binaire de l'application est une forme de pinning. Cela réduit la dépendance aux autorités de certification externes, mais crée un problème de rotation : le binaire doit déjà faire confiance à la clé de remplacement.

Conservez l'enveloppe signée complète. Les métadonnées de votre release doivent identifier l'artefact, son digest, le canal prévu et l'identifiant de clé. Les équipes qui intègrent cela dans Capacitor peuvent utiliser une checklist de signature de token pour apps Capacitor pour revoir le périmètre des clés, leur stockage et les limites de vérification avant livraison.

Applications concrètes dans les systèmes mobiles et web

La vérification de signature intervient à plusieurs niveaux d'un produit mobile, et chaque niveau répond à une question différente. La signature des stores aide le système d'exploitation à déterminer si un package installable provient d'un éditeur autorisé. Un bundle OTA signé permet de déterminer si le payload JavaScript et les assets proviennent de l'autorité de release à laquelle votre updater fait confiance. Une signature JWT aide un API à valider qu'un token a été émis par le service d'identité attendu.

Confondre ces couches crée des angles morts. Une signature IPA valide n'authentifie pas automatiquement un bundle web chargé ensuite. Un JWT valide ne prouve pas qu'un paquet de mise à jour est sûr. Une connexion TLS protège le transport, mais ne remplace pas la signature des artefacts quand un CDN, un proxy, un cache ou un système de build devient la source de l'altération.

Contexte Mécanisme de signature Mode de défaillance évité Faille courante
Package du store Signature code de la plateforme et contrôles de revue Package installable re-signé ou non autorisé La signature du store est censée couvrir les assets web post-install
Bundle web et service worker Échanges signés ou références d'intégrité de type SRI Réponse CDN empoisonnée ou asset modifié Seul le fichier d'entrée est vérifié, tandis que les assets importés ne sont pas vérifiés
token API Signature JWT validée avec une clé publique de confiance, souvent obtenue via un endpoint JWKS Token falsifié ou altéré Le serveur valide la signature mais ignore l'émetteur, l'audience, l'expiration ou l'usage du token
Mise à jour OTA Signature du bundle, détachée ou intégrée, vérifiée sur l'appareil Attaque man-in-the-middle ou injection de mise à jour altérée Le client télécharge, met en cache ou décompresse le contenu avant d'appliquer la décision

Pour les assets web, le subresource integrity peut limiter ce qu'un navigateur accepte pour une ressource référencée, mais cela ne résout pas automatiquement les imports dynamiques, les caches de service-worker ou un manifeste de mise à jour pointant vers un fichier choisi par un attaquant. L'implémentation doit définir l'ensemble complet des artefacts et vérifier les octets qui seront exécutés.

Les déploiements JWT échouent autrement. Les ingénieurs publient souvent la bonne clé publique mais acceptent un token avec un mauvais émetteur ou une mauvaise audience, ou font confiance à un algorithme indiqué dans le header du token. La signature cryptographique peut être valide alors que la décision d'autorisation est erronée.

Le contexte opérationnel compte également pour les produits qui dépendent de releases fréquentes et d'expériences mobiles client. Les équipes qui évaluent stratégies d'engagement des apps retail pour 2026 doit considérer l'intégrité des mises à jour comme un prérequis à l'expérimentation rapide. Un déploiement rapide n'est utile que si le canal de release, l'artefact et le destinataire sont tous liés à la même décision d'autorisation.

Construire un flux de vérification complet

Un updater de production doit faire de la vérification une étape bloquante, et non un callback exécuté peu après l'installation. La séquence sécurisée est déterministe :

  1. Récupérer un manifeste et une signature via un transport authentifié.
  2. Valider la structure du manifeste, la politique de version, le canal, l'expiration et l'identité de l'artefact.
  3. Télécharger exactement le bundle désigné par le manifeste.
  4. Calculer le digest du bundle localement.
  5. Vérifier la signature avec une clé publique Ed25519 ou RSA-PSS de confiance.
  6. Stocker l'artefact vérifié dans un emplacement isolé.
  7. L'appliquer de manière atomique, puis conserver une option de rollback.

Un diagramme en quatre étapes illustrant le processus de récupération, de vérification de signature et de validation d'un bundle de mise à jour logicielle.

Le manifeste doit lier toutes les valeurs qui influencent la décision. Au minimum, cela inclut le digest du bundle, la version, le canal, la plateforme et l'identifiant de clé. Ne laissez pas un downloader remplacer une URL, un nom de fichier ou un canal après la vérification. Le vérificateur doit recevoir des octets et des métadonnées immuables, puis renvoyer un seul résultat : accepté ou rejeté.

Voici une structure TypeScript simplifiée :

type UpdateManifest = {
  version: string
  channel: string
  platform: string
  sha256: string
  signature: string
  keyId: string
}

async function verifyBundle(
  bundle: Uint8Array,
  manifest: UpdateManifest,
  trustedKeys: Map<string, Uint8Array>
): Promise<boolean> {
  const publicKey = trustedKeys.get(manifest.keyId)
  if (!publicKey) return false

  const digest = await sha256(bundle)
  if (!constantTimeEqual(digest, hexToBytes(manifest.sha256))) {
    return false
  }

  try {
    return await ed25519Verify(
      base64ToBytes(manifest.signature),
      digest,
      publicKey
    )
  } catch {
    return false
  }
}

Cet exemple est volontairement strict. Un base64 malformé, un identifiant de clé inconnu, un digest qui ne correspond pas ou une signature invalide doivent entraîner un rejet. Un timeout pendant le téléchargement n'est pas une raison pour appliquer le fichier partiel précédent. Supprimez les artefacts incomplets, conservez la dernière version valide connue et réessayez selon une politique encadrée.

Prévenir les race conditions et erreurs de rollback

Téléchargez dans un chemin temporaire. Fermez le fichier et videz ses tampons, vérifiez son contenu complet, puis renommez-le dans un store versionné et vérifié. L'étape d'activation ne doit référencer que ce chemin vérifié. Dans les environnements Capacitor et Electron, évitez qu'un événement de fin de téléchargement asynchrone ne déclenche l'activation indépendamment de la promesse de vérification. Une seule machine à états de mise à jour doit gérer les transitions telles que downloading, verified, pending, active, rejected, et rolled_back.

La comparaison à temps constant est appropriée pour comparer des séquences d'octets sensibles, surtout lorsqu'un attaquant peut observer un comportement de vérification répété. Plus important sur le plan opérationnel : n'exposez pas de raccourci qui accepte un bundle sous prétexte qu'une tentative précédente a marqué la version comme disponible. La disponibilité et l'authenticité sont deux états distincts.

Le contrôles d'intégrité pour les mises à jour Capacitor constituent une référence d'implémentation utile pour garder distinctes la validation du hash et la logique d'activation. Testez délibérément les branches d'échec, notamment les fichiers tronqués, les signatures malformées, les clés inconnues, les manifestes obsolètes, les versions en double et l'arrêt du processus pendant l'activation.

La recherche sur la vérification automatisée des signatures montre pourquoi les seuils et les données de référence sont importants dans d'autres domaines. Une étude en ligne de 1994 a testé 22 caractéristiques, a sélectionné les meilleures 10, et a rapporté une 99.5% classification correcte des signatures authentiques tout en rejetant 86% les contrefaçons avec une méthode de distance euclidienne, selon l'étude publiée sur les méthodes statistiquesLa vérification des mises à jour logicielles est déterministe plutôt que biométrique, mais la leçon reste pertinente : définissez précisément les entrées et la limite de décision.

Les défis de gestion des clés souvent sous-estimés

La première clé de signature est simple. C’est la deuxième qui met l’architecture à l’épreuve.

Une équipe peut générer une paire de clés, placer la clé publique dans l’app et signer son premier bundle en une journée. Des mois plus tard, un ingénieur part avec l’accès à un ordinateur portable, un secret CI s’affiche dans un log de build, ou un job de signature doit migrer d’un runner à un autre. À ce stade, « il suffit de faire tourner la clé » peut signifier abandonner les appareils qui ne se sont pas connectés et n’ont aucun moyen de reconnaître la clé de remplacement.

Un graphique comparatif montrant la différence entre une configuration de clé simple et ponctuelle et les réalités complexes d’une production continue.

Trois problèmes méritent une attention particulière avant la première release :

  • Rotation sans impasse : Publiez la confiance pour une clé successeure avant d’exiger cette clé. Un enregistrement de transition signé peut permettre à une clé de confiance existante d’autoriser la clé suivante, tandis que l’app continue d’accepter l’ancienne clé pendant une fenêtre de migration définie.
  • Révocation sans hypothèses : Une clé épinglée dans une app ne fournit pas automatiquement de révocation de type OCSP ou CRL. Le client a besoin d’une liste de refus signée, d’une version minimale de clé acceptable, ou d’une politique contrôlée par le serveur qui reste sûre lorsque le réseau est indisponible.
  • Accès de signature restreint : Les runners CI doivent demander les opérations de signature à un vault ou un HSM, plutôt que de recevoir une clé privée réutilisable sous forme de variable d’environnement en clair. Les logs doivent masquer la sortie des commandes, et les pull requests issues de branches non fiables ne doivent pas accéder aux identifiants de signature de production.

Réalité opérationnelle : La rotation des clés est un problème de mise à jour. Si le mécanisme de mise à jour ne peut pas distribuer les changements de confiance en toute sécurité, il ne peut pas récupérer proprement d’une clé compromise.

Une hiérarchie de clés réduit le rayon d’impact. Une autorité racine peut autoriser les clés de release, tandis que des clés distinctes signent les canaux de développement, de staging et de production. La signature par seuil peut exiger plusieurs parties autorisées pour une release de production sensible, ce qui aide à empêcher qu’un seul identifiant volé ne crée une mise à jour valide. Ces contrôles ajoutent du processus et de la latence, les équipes doivent donc les appliquer selon l’impact de la mise à jour et la sensibilité du canal.

La confiance au premier usage est particulièrement faible pour les mises à jour mobiles. Si la première clé arrive par le même canal que le bundle, un attaquant qui contrôle ce canal peut remplacer les deux. L’ancrage de confiance initial doit se trouver dans le binaire de l’application, dans une configuration protégée par la plateforme, ou passer par un autre chemin authentifié de manière indépendante.

Pour les équipes Capacitor, l’approche documentée de Capgo inclut le pinning de clés publiques et la prise en charge de la rotation des clés. Le guide de gestion des clés pour les mises à jour OTA sécurisées fournit une référence pratique pour planifier ce cycle de vie, plutôt que de considérer la génération de clés comme une simple configuration initiale.

Intégrer la vérification au CI/CD et au monitoring

La signature fait partie intégrante de la transaction de release. Un pipeline ne doit pas publier d’abord un bundle, puis y attacher sa signature via une étape manuelle distincte. Générez l’artefact immuable, calculez son digest, signez les octets exacts, validez la signature via une étape de vérification dédiée, puis publiez le bundle et les métadonnées comme une seule unité de release.

Un pipeline concret produit ces artefacts :

  • Le bundle immuable : Le fichier que le client téléchargera, et non un répertoire qu’un CDN réempaquetera.
  • Le manifeste : Version, canal, plateforme, digest, identifiant de clé et politique de déploiement progressif.
  • La signature détachée : Une signature sur les données du manifeste canonique ou sur une représentation de digest précisément définie.
  • Le résultat de la vérification : Vérification lisible par machine que la signature est valide par rapport à la clé publique attendue pour cet environnement.

GitHub Actions et GitLab CI peuvent appliquer le même schéma, même si leur syntaxe diffère. Le job de signature doit échouer si le service de signature privé est indisponible, si la signature est malformée ou si une copie de test fraîchement téléchargée ne passe pas la vérification. Un job de déploiement doit dépendre de ce résultat, pas seulement d’un build réussi.

Ne signez pas un chemin pour ensuite autoriser un job ultérieur à le modifier. Verrouillez l’artefact après la signature, comparez son digest avant publication et assurez-vous que le manifeste publié est reproductible à partir de l’enregistrement de la release. Cela détecte un écart d’intégration étonnamment courant, où le job CI signe une archive compressée tandis que la couche de livraison sert un fichier recompressé ou régénéré.

L'observabilité doit se faire sur l'appareil

Un job de signature réussi ne prouve que votre pipeline a créé une signature valide. Il ne prouve pas que les appareils ont reçu les octets prévus ni que l’app a utilisé la clé attendue. Enregistrez les résultats de vérification avec la version de l’app, la version de la mise à jour, le canal, la plateforme, l’identifiant de la clé, la catégorie du résultat et un ID de corrélation de release sûr pour la vie privée. Évitez de journaliser le bundle, le token, les métadonnées privées ou le contenu utilisateur.

Les dashboards utiles séparent :

  • les échecs de signature des échecs de téléchargement,
  • les incohérences de digest des manifestes malformés,
  • les clés inconnues des rejets de politique,
  • les échecs par version d’app, région, canal et ancienneté de la release.

Un pic soudain d’incohérences de digest peut indiquer un cache corrompu, un chemin de livraison altéré ou une erreur de publication d’artefact. Les événements de clé inconnue peuvent signaler une rotation incomplète ou une tentative de release non autorisée. La télémétrie de vérification n’identifiera pas l’attaquant à elle seule, mais elle fournit aux intervenants une chronologie et une population à investiguer.

Le Recommandations de sécurité CI/CD pour les mises à jour OTA Capacitor peut aider les équipes à centraliser la signature, la validation et les contrôles de déploiement dans un seul workflow. Le choix de conception clé est la responsabilité. La sécurité ne devrait pas avoir à demander à l’ingénierie si la vérification a été exécutée. L’historique de la release et la télémétrie client doivent y répondre directement.

Bonnes pratiques de sécurité et pièges courants

La vérification de signature doit être une exigence stricte pour tout chemin de mise à jour pouvant exécuter code. Le module de mise à jour doit vérifier avant l’extraction, l’installation ou l’activation, et échouer de manière sécurisée si la signature, le digest, la clé ou le contrôle de politique est indisponible.

Utilisez ceci comme liste de contrôl’immédiate :

  • Protégez les clés privées : Keep signing material in an HSM or managed vault. Never commit it to source control, place it in a mobile binary, or allow it into CI logs.
  • Épinglez les clés publiques de confiance : Stockez l’ancrage de confiance initial en dehors du payload de mise à jour. Si vous utilisez plusieurs clés, définissez leurs rôles et les règles de transition.
  • Liez la release complète : Signez les métadonnées canoniques qui identifient le bundle, le canal, la plateforme et la politique prévus.
  • Rejetez toute erreur de vérification : Un timeout, une signature malformée, une clé inconnue ou un manifeste manquant n’est pas une invitation à continuer avec le résultat précédent non vérifié.
  • Test de récupération après compromission : Testez la rotation des clés, la gestion des clés révoquées, le rollback, les téléchargements interrompus et les appareils obsolètes en staging.
  • Vérifier les changements du vérificateur : Exiger une revue code axée sur la sécurité pour les bibliothèques cryptographiques, la canonicalisation, le parsing, le comportement de repli et la configuration de debug.
  • Isolez le comportement de debug : Il doit être impossible d'inclure un bypass de développement dans un build de production via un flag par défaut ou une erreur d'environnement.

Une signature ne prouve pas non plus la fraîcheur, la liaison au destinataire, la résistance au rejeu, ni que le payload reste compatible avec l'état actuel du fournisseur. Les recommandations de sécurité des webhooks établissent clairement cette distinction, et des rapports de vulnérabilité récents ont montré que des signatures malformées ou nulles, ainsi que des problèmes de canonicalité, peuvent encore compromettre des contrôles de validation limités. Lisez l'analyse des écarts de sécurité des webhooks lors de la conception des règles d'autorisation associées.

Le choix du seuil offre une leçon similaire pour les systèmes biométriques. Une étude utilisant 62 caractéristiques paramétriques sur 1 232 signatures de 102 individus des seuils dépendant de l'écrivain signalés de 2,8 % de faux rejets et 1,6 % de fausses acceptations, tandis qu’une autre méthode rapportait 2,68 % de faux rejets et 1,99 % de fausses acceptations, comme documenté dans le recherche sur le choix du seuil. L’application diffère, mais le principe opérationnel est le même : la politique de décision du vérificateur compte autant que la primitive cryptographique.

Capgo peut constituer une option d’implémentation pour les équipes Capacitor et Electron qui ont besoin de bundles de live update signés, de vérification sur l’appareil, de contrôles de déploiement progressif, de protection contre le rollback et d’observabilité de la livraison dans le même système. Visiter Capgo pour évaluer si son workflow de mise à jour répond à vos exigences en matière de gestion des clés, CI/CD et de supervision.

Live updates pour les apps Capacitor

Lorsqu'un bug de la couche web est en ligne, déployez le correctif via Capgo au lieu d'attendre des jours l'approbation des stores. Les utilisateurs reçoivent la mise à jour en arrière-plan, tandis que les changements natifs suivent le circuit de validation habituel.

Les derniers articles du blog

Capgo vous offre les meilleures informations pour créer une application mobile vraiment professionnelle.