IPAに再署名(iPhone)


129

私は現在、すべてのアプリケーションをhudsonでxcodebuildを使用してビルドし、その後xcrunを問題なくビルドしています

さまざまな人々から、企業アカウントではなく企業アカウント(アプリストア用、またはアドホック分散用)で再署名したいIPAファイルをいくつか受け取りました。

私の問題は、アプリを辞任しようとしたときに、デバイスにインストールされないことです(エンタープライズビルドなのでインストールする必要があります)。エラーメッセージはデバイス上(iTunesではなく)に表示され、アプリをインストールできなかったことがわかります。これ以上の情報は提供されていません。

いくつかの情報を見つけました(http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-アップロード/

そして、これは可能かもしれません。私が直面している問題は、通常のビルド(xcrunを使用)の場合のように、モバイルプロビジョニングプロファイルが埋め込まれていないように見えることです。これは、codesignツールで制御できるか、xcrunで再署名できる?

私の辞任スクリプトで私は現在

  • app.ipaを解凍します
  • appname = $(ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

結果のipaファイルを調べたところ、元のアプリとよく似ているようです。ここで実際に変更する必要があるのはどのファイルですか?最初は_CodeSignature / CodeResourcesが変わると思っていましたが、内容はまったく同じに見えます。

ポインタは大歓迎です。

回答:


211

ついにこれが機能しました!

プロビジョニングプロファイルにデバイスが追加されていないアプリストア送信用にcert1で署名されたIPAでテストされています。エンタープライズアカウントで署名された新しいIPAと社内展開用のモバイルプロビジョニングプロファイルが作成されます(モバイルプロビジョニングプロファイルはIPAに埋め込まれます)。

解決:

IPAを解凍します

unzip Application.ipa

古いCodeSignatureを削除する

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

埋め込まれたモバイルプロビジョニングプロファイルを置き換える

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

再署名

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

再パッケージ

zip -qr "Application.resigned.ipa" Payload

編集:資格の部分を削除しました(路地コメント、感謝を参照)


6
私たちの問題の原因の1つは、エンタイトルメントファイルでした(ある場合)、Appleから提供されたアプリIDと一致する必要があります。バンドルIDを変更していたため、資格が一致しませんでした。アプリは実行されますが、キーチェーンは実行ごとにクリアされます。
tjg184

5
oleb.net/blog/2011/06/code-signing-changes-in-xcode-4によると、アプリIDはバイナリに組み込まれているため、同じアプリIDを使用してのみ再署名できます。別のアプリIDで辞任できなかったことがわかっています。
Michael Baltaks、2011

7
@ValerioSantinelli以前のコード署名からの資格を引き継ぐ必要があります。FWIWプッシュ通知は、資格がないと機能しません。解凍後:/usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.app辞任中に追加--entitlements entitlements.plist
Peter

11
Yosemiteでcodesignが失敗する-警告:--resource-rulesはMac OS X> = 10.10では廃止されました!Payload / Aaa.app / ResourceRules.plist:リソースを読み取れません
Jibeex 2014年

4
警告:--resource-rulesはMac OS X> = 10.10では廃止されました!Payload / Application.app / ResourceRules.plist:リソースを読み取れません。このエラーが発生しましたか?
megha

44

この質問への回答は少し古く、潜在的な重要な手順が欠けているため、これは外部開発者からアプリをインストールするための更新されたガイドです。

----- iOSアプリを辞任する方法-----

別の開発者からアプリ(例:MyApp.ipa)を受け取り、それをデバイスにインストールして実行できるようにしたいとします(たとえば、ideviceinstallerを使用して)。

新しい署名アセットを準備する

最初のステップは、インストールして実行したいすべてのデバイスを含むプロビジョニングプロファイルを取得することです。キーチェーンアクセスにインストールした証明書がプロファイルに含まれていることを確認します(例:iPhone Developer:Some Body(XXXXXXXXXX))。プロファイル(MyProfile.mobileprovision)をダウンロードして、アプリに埋め込まれたプロファイルを置き換えることができるようにします。

次に、署名に含める資格ファイルを準備します。ターミナルを開いて、以下を実行します。

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

これにより、プロビジョニングプロファイルを説明するxmlファイルが作成されます。次に、資格をファイルに抽出します。

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

プロビジョニングプロファイルを置き換えてアプリを辞任

.ipaファイルを使用している場合は、まずアプリを解凍します(代わりに.appがある場合は、この手順をスキップできます)。

$ unzip MyApp.ipa

これで、作業ディレクトリにはPayload/およびが含まれますPayload/MyApp.app/。次に、古いコード署名ファイルを削除します。

$ rm -rf Payload/MyApp.app/_CodeSignature

既存のプロビジョニングプロファイル(つまりembedded.mobileprovision)を独自のものに置き換えます。

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

次に、プロビジョニングプロファイルに含まれている証明書と、前に作成したentitlements.plistを使用してアプリに署名します。

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

重要:アプリに含まれるすべてのフレームワークも辞任する必要があります。これらはにありPayload/MyApp.app/Frameworksます。アプリがSwiftで記述されている場合、または追加のフレームワークが含まれている場合は、これらを辞任する必要があります。そうしないと、アプリはインストールされますが実行されません。

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

これで、アプリを再圧縮できます。

$ zip -qr MyApp-resigned.ipa Payload

できた

Payload元のアプリ(MyApp.ipa)と署名済みバージョン(MyApp-resigned.ipa)があるので、ディレクトリを削除できます。これで、プロビジョニングプロファイルに含まれている任意のデバイスにMyApp-resigned.ipaをインストールできます。


これと同じアプローチが配布プロファイルに適用されますか?IE:資格を抽出して、distro.mobileprovisionから再署名できますか?
チェイスフローレル2016年

@grezこれはIPAの配布でも機能しますか?
LearneriOS 2016

「エンタープライズ」アプリのIPAと@grezの配布を意味します
LearneriOS

@LearneriOSこれは、エンタープライズIPAディストリビューションでは機能しませんでした。私はSierra、Xcode 8、iOS 10を使用しています。アプリはiTunes経由でインストールされますが、インストール後すぐに削除されます。
ブライアンブライス

@PhoenixFF iTunesでインストールするかどうかはわかりませんが、次のようにコマンドラインからインストールしてみてください。$ ideviceinstaller -i myapp.ipa
InnisBrendan

11

私はこの回答に成功しましたが、資格が変更されたので、--entitlements "Payload/Application.app/Entitlements.plist"最後から2番目のステートメントの部分を単に削除しましたが、それは魅力のように機能しました。


私は前のコメントを2番目にします。最新のツールキットでこれを機能させるには、資格を削除してください。
Bruno Bronosky

2
資格がないと、私のアプリは実際には奇妙な動作を始め、これをログに記録しました:SecItemCopyMatching: missing entitlement。私は個別のEntitlements.plistファイルを持っていないので、@ LordTのコメントを使用して資格を保持するには、最初に資格ファイルを作成しecho "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements、次に署名時にそれを使用します--entitlements temp/newEntitlements
Bulat 2013

5

Mac OS High SierraおよびXcode 10で確認済み

アプリケーションiResignを使用して同じことを簡単に実装できます。

1).ipaのパスを与える

2)新しいプロビジョニングプロファイル

3)資格ファイル(オプション、資格がある場合にのみ追加)

4)バンドルID

5)配布証明書

再署名後に保存された出力.ipaファイルを確認できます

シンプルで強力なツール


4

これらの辞任するアプローチのどれも私にとってはうまくいかなかったので、私は何か他のものを考え出さなければなりませんでした。

私の場合、有効期限が切れた証明書を持つIPAがありました。アプリを再構築することもできましたが、まったく同じバージョンを(新しい証明書を使用して)確実に配布したかったため、再構築したくありませんでした。

他の回答で述べられている辞任の方法の代わりに、ビルドからの.xcarchiveで始まるIPAを作成するXcodeの方法を使用しました。

  1. 既存の.xcarchiveを複製し、コンテンツの置き換えを開始しました。(.dSYMファイルは無視しました。)

  2. 古いIPAファイルから古いアプリを解凍しました(解凍により、ペイロードフォルダーにはアプリのみが含まれています)

  3. このアプリを新しい.xcarchiveに移動し、Products/Applicationsそこにあったアプリを置き換えました。

  4. 編集Info.plist、編集

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. 私は.xcarchiveをXcodeのアーカイブフォルダー(通常は)に移動しました/Users/xxxx/Library/Developer/Xcode/Archives

  6. Xcodeで、Organizerウィンドウを開き、この新しいアーカイブを選択して、通常の(この場合はEnterprise)エクスポートを行いました。

その結果、適切なIPAが機能しました。


1
これは、Xcode 9.2でも機能する天才的なソリューションです。私の場合、既存の.xcarchiveの下にある古い.appファイルをコピーしただけです。Info.plistを変更しなかったため、アプリのバージョンは古いバージョンのままでしたが、新しいエンタープライズ証明書で署名されました。
dodgy_coder

3

Fastlaneを使用するのが最も簡単だと思います。

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

私は多くの方法を試しましたが、運はありませんでした。この解決策は私に役立ちました。
Omid Kia

1

Fastlane sighの辞任オプションを使用すると、これを非常に簡単に行うことができます。

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

コマンドの直前に、sighを使用してプロファイルをダウンロードすることもできます。


0

Erikさん、これを投稿していただきありがとうございます。これでうまくいきました。必要な追加の手順に関するメモを追加したいと思います。内の「ペイロード/ Application.app /」「という名前のディレクトリがあったCACertChains」という名前のファイルに含まれる「cacert.pemのは、」。これらの手順を完了するには、ディレクトリと.pemを削除する必要がありました。再度、感謝します!–


-1

拡張機能や時計アプリを備えたアプリがあり、拡張機能や時計アプリごとに複数のプロビジョニングプロファイルがある場合は、このスクリプトを使用してipaファイルに再署名する必要があります。

Githubでスクリプトに再署名する

このスクリプトの使用例を次に示します。

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

さらに別の-pオプションを使用して追加することにより、他の拡張プロビジョニングプロファイルも含めることができます。

私にとって-すべてのプロビジョニングプロファイルは、同じ証明書/署名IDで署名されていました。


リンクが壊れています...著者のgithubを見てこの代替案を見つけました。github.com/fastlane/fastlane/blob/…– jugutier 2017
1

これは古い回答であり、おそらく機能しないため削除する必要がありますが、StackOverflowで削除する方法はありません
RPM

1
:私たちのために働いていたこれは、ちょうどこのリンクに更新する必要がありgithub.com/fastlane/fastlane/blob/...
jugutier

それがまだ機能することを知って大丈夫です。元の回答をもう編集できないので、コメントを読む必要があります:)
RPM

fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision代わりに使用してください。
green0range 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.