Comment re-signer le fichier ipa?

107

Comment signer le fichier .ipa avec un profil d'approvisionnement après avoir généré un IPA comme celui-ci avec un profil d'approvisionnement différent? Je souhaite signer l'IPA avec un profil d'approvisionnement ad-hoc pour les tests bêta, puis resigner l'IPA exacte avec un profil d'approvisionnement de soumission d'application pour l'App Store.

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"
Johnny
la source
1
Possible duplicata de Re-sign IPA (iPhone)
InnisBrendan

Réponses:

207

C'est vraiment facile à faire depuis la ligne de commande. J'avais l'essentiel d'un script pour faire cela. Il a maintenant été intégré dans le script ipa_sign de https://github.com/RichardBronosky/ota-tools que j'utilise quotidiennement. Si vous avez des questions sur l'utilisation de ces outils, n'hésitez pas à les poser.

Le cœur de celui-ci est le suivant:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

Votre nouvelle application signée s'appelle resigned.ipa

Bruno Bronosky
la source
31
7 votes et pas une seule question. Je suppose que ma bash est aussi claire que cela.
Bruno Bronosky
4
En effet, il est gentil Monsieur.
Rui Peres
3
@RahmathullahMPulikkal Je vois que j'avais mal codé en dur un chemin dans l'essentiel. Vous devriez vraiment utiliser github.com/RichardBronosky/ota-tools/blob/master/ipa_sign au lieu de l'essentiel. C'est le code maintenu.
Bruno Bronosky
5
Vous pouvez obtenir un avertissement / une erreur sur les paramètres --resource-rules, qui ont été obsolètes dans OS X Yosemite (10.10), supprimez simplement ce paramètre pour résoudre ce problème.
ıɾuǝʞ
4
Une petite note: il semble qu'il se CodeResourcestrouve maintenant à l' intérieur du _CodeSignaturedossier, il vous suffit donc de supprimer ce dossier.
dadude999
36

Vérifiez iResign pour un outil simple sur la façon de procéder!

[modifier] après quelques manipulations, j'ai trouvé une solution à la démission sensible au trousseau. Vous pouvez le vérifier sur https://gist.github.com/Weptun/5406993

Blitz
la source
existe-t-il un outil qui peut changer le nom d'affichage avec l'identifiant du bundle lors de la démission? Cela aidera à avoir différents noms d'affichage pour différents environnements. comme App-Dev, App-QA, App-Stage etc.
Nishanth Nair
1
Oui, le floatsign.sh fait exactement cela.
Blitz
Travaux. Simple et beau.
Arjun Kalidas
13

Une sorte de vieille question, mais avec le dernier XCode, codesignc'est facile:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement
BryanH
la source
2
@Pavel Cette question a reçu une réponse lorsque iOS 6.x était la dernière version. Depuis, nous avons eu deux versions majeures, ce qui a évidemment changé beaucoup de choses. Vous souhaiterez peut-être limiter vos recherches aux réponses qui ciblent la technologie actuelle.
BryanH
Cela a fonctionné pour moi. vous devez remplacer "my_certificate" par le nom de la clé de votre porte-clés.
Franziskus Karsunke
2
codesignLa commande est également utilisée dans la réponse @BrunoBronosky. Je ne peux pas l'utiliser directement sur le fichier "* .ipa", et les options "-vv" retournent toujours code object is not signed at allsur les fichiers dont je sais qu'ils sont signés ...
Mariano Paniga
12

Les réponses affichées ici n'ont pas vraiment fonctionné pour moi. Ils ont principalement ignoré la signature des cadres intégrés (ou y compris les droits).

Voici ce qui a fonctionné pour moi (cela suppose qu'un fichier ipa existe dans le répertoire actuel):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/
Simonseyer
la source
Commentaire utile du post ci-dessus (Rich): stackoverflow.com/questions/5160863/…
Serzas
9

Le soupir de Fastlane fournit une solution assez robuste pour démissionner des IPA.

Depuis leur README:

Démissionner

Si vous avez généré votre ipafichier mais que vous souhaitez appliquer un code différent de signature sur le fichier ipa, vous pouvez utiliser sigh resign:

fastlane sigh resign

sigh trouvera le fichier ipa et le profil d'approvisionnement pour vous s'ils se trouvent dans le dossier actuel.

Vous pouvez transmettre plus d'informations en utilisant la ligne de commande:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Il gérera même les profils de provisionnement pour les applications imbriquées (par exemple, si vous avez des applications watchkit)

Mattliu
la source
8

J'ai mis à jour le code de Bryan pour mon iMac Sierra:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload
Pierre Priot
la source
i git le entitlements.plist d'erreur suivant: type de blob non reconnu (accepter aveuglément) entitlements.plist: longueur non valide dans le blob droit
Amr colère
pouvez-vous partager le contenu de votre fichier de droits?
Pierre Priot
A travaillé comme un charme!
Luis E. Prado
5
  1. Décompressez le fichier .ipa en changeant son extension avec .zip
  2. Accédez à Payload. Vous trouverez le fichier .app
  3. Cliquez avec le bouton droit sur le fichier .app et cliquez sur Afficher le contenu du package
  4. Supprimer le _CodeSigneddossier
  5. Remplacez le embedded.mobileprovisionfichier par le nouveau profil de mise à disposition
  6. Accédez à KeyChain Access et assurez-vous que le certificat associé au profil provisoire est présent
  7. Exécutez la commande mentionnée ci-dessous: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Maintenant, zippez à nouveau le dossier Payload et changez l'extension .zip avec .ipa

J'espère que cela vous sera utile.

Pour référence, suivez le lien ci-dessous: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

Dharmesh Siddhpura
la source