Signature des applications iOS


La signature des applications Apple peut être un peu déroutante pour les développeurs non initiés à l’écosystème iOS, les termes comme “Provisioning profile” et “Signing certificate” évoquent à certains une forme de magie noire et pas mal de souvenirs douloureux.

Le but de cet article est justement de démystifier ce fonctionnement en expliquant simplement les processus de signature, les termes associés et les différentes possibilités de distribution d’une application iOS.

Nous allons voir dans un premier temps ce qu’est la signature d’application et ce qu’elle n’est pas. Nous étudierons ensuite les prérequis à la signature, dont l’obtention d’un certificat. Viendra ensuite la signature en elle-même et ses différentes étapes. Enfin, nous analyserons ce qu’est un provisionning profile et à quoi il sert.

Le but de la signature d’application

  • Authentifier l'émetteur de l’application.
  • Déterminer si ce code est une nouvelle version d’une application.
  • Détecter des modifications, des altérations du code : On peut donc déterminer s' il s’agit bien du code que le développeur a produit.

Ce que la signature n’est pas

  • Elle ne garantit pas le contenu du code : Le code peut très bien ne pas faire ce qu’il est censé faire. Il peut contenir des vulnérabilités ou même du code malicieux.
  • Elle n'obfusque pas le code : il reste complètement lisible.

Prérequis

Matériel

Pour pouvoir signer une application il est nécessaire d’avoir un Mac et XCode.

Certificat

On doit tout d’abord créer un certificat.

Le certificat est un paquet contenant des informations d’identité du développeur, la clé publique ainsi que les informations de période de validité. ll peut être lui-même signé par Apple qui garantit les informations d’identité.

Il faut se souvenir d’une chose importante : un certificat est lié à une clé privée.

De ce fait, si l’on travaille à plusieurs sur une application, il faut partager ce certificat et sa clé privée pour que tous les développeurs puissent signer l’application. Pour ça il faut l’exporter vers un fichier .p12 qui peut facilement être partagé.

Les différents types de certificats

Development : Permet de déployer l’application pendant le développement sur des appareils de test via XCode.

Distribution : Permet de distribuer l’application :

  • Au public en la soumettant sur l'App Store.
  • À un panel de testeurs via Testflight :
    • 100 testeurs internes (étant membre de l’organisation) : Ils ont accès à toutes les versions uploadées.
    • 10 000 testeurs externes ( invitation par email ou lien de téléchargement ) qui ont accès à une version soumise ayant été validée par Apple pour un test public.
  • Via une distribution Ad Hoc à un panel de testeurs dont les appareils sont enregistrés sur le portail développeur (limité à 100). L’application devra alors être déposée sur un serveur sécurisé pour être téléchargée par les utilisateurs. On peut par exemple utiliser Firebase App Distribution pour la distribuer.

Nous allons voir maintenant comment générer ces certificats.

Obtenir un certificat Apple

Prérequis :

Avoir souscrit à l’Apple Developer Program.

La personne qui demande un certificat de distribution doit être Administrateur du compte ou Gestionnaire d’apps ayant accès à “Certificats, identifiants et profils”.

(matrice des rôles)

Automatiquement via XCode

Il s’agit du comportement par défaut quand on crée un nouveau projet avec XCode.

Sinon il suffit de cocher cette case :

⚠️ La gestion automatique de la signature n’est valable que lorsqu’il n’y a qu’un seul développeur sur le projet

En effet XCode va faire la demande de certificat et générer les provisioning profiles lui-même, il peut également décider de les modifier. Ce qui a comme conséquence de casser le système de build chez les autres développeurs car leur certificat n’est alors plus valide.

Manuellement

  1. Créer une Certificate Signing Request :

    https://help.apple.com/developer-account/#/devbfa00fef7

  2. Enregistrer la demande de certificat localement.

    Cela crée un fichier CertificateSigningRequest.certSigningRequest.

  3. Connexion sur :

    https://developer.apple.com/account

  4. Aller sur :

    https://developer.apple.com/account/resources/certificates/list

  5. Cliquer sur +

  6. Sélectionner le certificat voulu :

  7. Uploader la demande de certificat :

  8. Récupérer le certificat en cliquant sur download :

  9. Nous avons finalement notre .cer sur notre machine, il ne reste plus qu’à double-cliquer dessus pour l’installer.

Le processus

Lorsqu'on utilise Xcode, la signature du code se fait de façon transparente. On écrit du code, on lance une compilation avec un déploiement automatique vers un appareil (iPhone, iPad etc..) et on teste nos modifications.

Entre la compilation et l’envoi vers l’appareil, le code a été signé avec un certificat de développement.

On peut voir et modifier le certificat qui est utilisé dans l’onglet “Signing & Capabilities” du projet.

On peut également signer manuellement l’application en utilisant l’utilitaire “codesign” en ligne de commande.

Nous allons voir maintenant comment est réalisée cette signature.

Les étapes de la signature

  1. Compilation : création du fichier exécutable en fonction de la cible choisie.
  2. Création du sceau : Le processus de signature va récupérer les différents fichiers de l’application et générer un hash de ces fichiers.
  3. La signature : Les différents hashs du sceau vont ensuite être chiffrés à l’aide de la clé privée de l'émetteur (signataire). Cette signature du sceau est ajoutée aux côtés du code.
  4. Ajout du certificat correspondant au bundle final (Pour simplifier l’explication l’ajout du certificat a été mis à la fin. Cependant il est ajouté au moment de la création du bundle).

Pour résumer :

Application signée = Certificat + signature + exécutable + ressources

Vérification

Vérification d’identité :

Les informations d’identité sont contenues dans le bundle. On peut les afficher grâce à la commande codesign :

La clé publique contenue dans le certificat sert à déchiffrer le sceau.

L’autorité de vérification va générer les mêmes hashs à partir des données et vérifier qu’elle obtient les mêmes résultats que le sceau. On peut vérifier manuellement la validité de la signature :

Pas de réponse, le bundle est valide.

Maintenant si on modifie l’exécutable :

La validation échoue.


De même si je modifie une ressource :

La modification est détectée et l’application n’est pas validée.

Provisioning profile

Définition

Il s’agit d’un paquet liant le certificat, les appareils cibles, et l’application.

  • Il permet l’exécution de l’application en développement.
  • Il sécurise les builds de développement qui ne peuvent être exécutés que sur les appareils enregistrés.
  • Il permet la distribution interne d’un build sans nécessité de vérification de celui-ci par Apple.

Provisioning profile = AppID + UDID’s + signature avec le certificat

où :

  • AppID : (chaîne aléatoire) + bundle identifier
  • UDID : code unique identifiant les appareils iOS (Unique Device IDentifier)

Génération du provisioning profile

  1. Création du bundle id :

    https://developer.apple.com/account/resources/identifiers/list

  2. Sélection d’un type de provisioning profile :

    https://developer.apple.com/account/resources/profiles/add

  3. Sélection de l’app id :

  4. On sélectionne le certificat

  5. Les appareils autorisés

  6. Enfin on lui donne un nom

  7. On le télécharge

  8. Puis on va l’importer dans XCode

⚠️ Erreurs :
Il se peut que des erreurs du type “provisioning profile doesn't include signing certificate” aient lieu. Il faut aller dans le “Trousseau d’accès” et supprimer les certificats en doublons puis redémarrer l’ordinateur.

Conclusion

Comme nous l’avons vu, la signature des applications iOS permet de vérifier l’authenticité du code d’une application et le déploiement de celui-ci sur des appareils cibles. Elle est régie par un système de certificats et d’autorité de vérification (Apple).

La gestion automatique des certificats par XCode est très simple mais pose de gros problèmes au sein d’une équipe. Générer manuellement ces certificats et les partager règle ces problèmes, cependant la procédure est un peu fastidieuse.

Pour pallier ces problèmes chez Ippon nous utilisons le logiciel Fastlane Match qui permet la création, le stockage, et la distribution des certificats de façon centralisée.


Glossaire

Terme Définition
Bundle identifier Chaîne définie par le développeur pour identifier le paquet ( ex : com.ippon.topapp)
AppID (chaîne aléatoire) + bundle identifier
UDID Code unique identifiant les appareils iOS (Unique Device IDentifier)
Provisioning profile AppID + UDID’s des appareils autorisés + signature avec le certificat
Application signée Certificat + signature + exécutable + ressources
Sceau Collection des différents hashs générés à partir des ressources et du code de l’application. Il sert lors de la vérification à vérifier si les fichiers ont changé.

sources :