重新签署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有效载荷)
  • xcrun -sdk iphoneos PackageApplication -s“ $ provisioning_profile”“ $ project_dir / Payload / $ appname” -o“ $ project_dir / app-resigned.ipa” --sign“ $ provisioning_profile”-嵌入“ $ mobileprovision”

我查看了生成的ipa文件,它似乎与原始应用程序非常相似。什么文件真正应该在这里更改?我最初以为_CodeSignature / CodeResources会更改,但是内容看起来几乎完全一样。

指针非常感谢。

Answers:


211

终于成功了!

已在通过cert1签名的IPA进行测试,以进行应用商店提交,且未在配置文件中添加任何设备。生成一个新的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
引起我们问题的一件事是权利文件(如果有的话)必须与Apple提供的应用程序ID相匹配。由于我们正在更改分发包ID,因此权利不匹配。该应用程序将运行,但钥匙串将在每次运行后清除。
tjg184 2011年

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
彼得

11
优胜美地上的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)。

准备新的签名资产

第一步是获得一个Provisioning Profile,其中包括您希望安装和运行的所有设备。确保配置文件包含您已在“ 钥匙串访问”中安装的证书(例如,iPhone Developer:Some Body(XXXXXXXXXX))。下载配置文件(MyProfile.mobileprovision),以便您可以替换应用程序中嵌入的配置文件。

接下来,我们将准备一个权利文件以包括在签名中。打开您的终端并运行以下命令。

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

这将创建一个描述您的Provisioning Profile的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中提取权利并重新签名吗?
Chase Florell '16

@grez是否也可以用于分发IPA?
LearneriOS '16

我的意思是分发“企业”应用程序IPA以及@grez
LearneriOS '16

@LearneriOS这不适用于企业IPA分发。我正在使用Sierra,Xcode 8,iOS10。该应用程序通过iTunes安装,但在安装后立即被删除。
布莱恩·布莱斯

@PhoenixFF我不确定是否可以使用iTunes进行安装,但是您可以尝试从这样的命令行进行安装:$ ideviceinstaller -i myapp.ipa
InnisBrendan

11

我成功地遵循了这个答案,但是由于权利已经更改,因此我只删除了--entitlements "Payload/Application.app/Entitlements.plist"倒数第二条语句的一部分,它就像一个魅力一样工作。


我将第二条评论。删除权利,以使其与现代工具包一起使用。
布鲁诺·布罗诺斯基

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
2013年

5

经过Mac OS High Sierra和Xcode 10的检查

您可以使用iResign应用程序简单地实现相同的功能

给出1).ipa的路径

2)新的配置文件

3)授权文件(可选,仅在有授权的情况下添加)

4)捆绑ID

5)发行证明

重新签名后,您可以看到保存的输出.ipa文件

简单而强大的工具


4

这些辞职方法都没有对我有用,因此我不得不制定其他办法。

就我而言,我的IPA证书已过期。我本可以重建该应用程序,但是由于我们想确保分发的版本完全相同(只是带有新证书),因此我们不想重建它。

我没有使用其他答案中提到的辞职方式,而是转向了Xcode创建IPA的方法,该方法从构建中的.xcarchive开始。

  1. 我复制了现有的.xcarchive并开始替换内容。(我忽略了.dSYM文件。)

  2. 我从旧的IPA文件中提取了旧应用(通过解压缩;该应用是Payload文件夹中的唯一内容)

  3. Products/Applications替换那里的应用程序的情况下,我将该应用程序移至新的.xcarchive中。

  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>

您也可以在命令之前使用叹气下载配置文件。


0

谢谢Erik,发布了此信息。这对我有用。我想添加一条注释,说明我需要执行的额外步骤。在“ Payload / 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选项来包括其他扩展配置文件。

对我来说-所有供应配置文件均由相同的证书/签名标识签署。


您的链接已损坏...通过查看作者的github找到了这种选择。github.com/fastlane/fastlane/blob/…–
jugutier

这是一个旧的答案,可能应该删除,因为它不再起作用,但是无法在StackOverflow中将其删除
RPM

1
这对我们有用
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.