重新签署IPA(iPhone)

时间:2011-08-01 08:44:43

标签: iphone build codesign ipa

我目前用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-upload/

这可能是可能的。我面临的问题是它似乎没有嵌入移动配置文件,因为我使用我的普通版本(使用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”< / LI>

我查看了生成的ipa文件,它似乎与原始应用程序非常相似。这里应该改变哪些文件?我最初认为_CodeSignature / CodeResources会改变,但内容看起来几乎完全一样。

非常感谢指针。

13 个答案:

答案 0 :(得分:208)

终于搞定了!

使用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

编辑:删除了权利部分(参见小巷评论,谢谢)

答案 1 :(得分:34)

此问题的答案有点过时,并且缺少可能的关键步骤,因此这是从外部开发人员安装应用程序的更新指南。

-----如何重新启动iOS应用程序-----

假设您从其他开发人员那里收到了一个应用程序(例如MyApp.ipa),并且您希望能够在您的设备上安装并运行它(例如,使用 ideviceinstaller )。< / p>

准备新的签名资产

第一步是获得配置文件,其中包含您要安装和运行的所有设备。确保配置文件包含您在 Keychain Access 中安装的证书(例如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。

答案 2 :(得分:11)

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

答案 3 :(得分:4)

已在Mac OS High Sierra和Xcode 10中进行检查

您可以使用应用程序iResign来实现相同的功能。

给出的路径 1).ipa

2)新的配置文件

3)权利文件(可选,仅在有权利时添加)

4)捆绑包ID

5)发行证书

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

简单而强大的工具

答案 4 :(得分:3)

这些辞职方法都不适合我,所以我不得不解决其他问题。

在我的情况下,我有一个过期证书的IPA。我本可以重建应用程序,但因为我们想确保我们分发完全相同的版本(仅使用新证书),我们不想重建它。

我没有采用其他答案中提到的辞职方式,而是采用了Xcode创建IPA的方法,该方法以构建中的.xcarchive开头。

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

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

  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中,我打开了“管理器”窗口,选择了这个新档案,并定期(在本例中为“企业”)导出。

  7. 结果是有效的IPA。

答案 5 :(得分:1)

使用Fastlane叹气的辞职选项,你可以很容易地做到这一点。

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

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

答案 6 :(得分:1)

在2020年,我与Fastlane做到了-

这是我使用的命令

TextBox

此处提供完整文档-https://docs.fastlane.tools/actions/resign/

答案 7 :(得分:0)

感谢Erik发布此内容。这对我有用。我想添加一个关于我需要的额外步骤的说明。在“Payload / Application.app /”中,有一个名为“ CACertChains ”的目录,其中包含名为“ cacert.pem ”的文件。我不得不删除目录和.pem来完成这些步骤。再次感谢! -

答案 8 :(得分:0)

我认为最简单的方法是使用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"

答案 9 :(得分:0)

我尝试了所有解决方案,但最终我可以使用这些命令创建辞职ipa

辞职证书

  • *是IPA名称,也是应用程序名称 $ PROVISION是配置文件的路径 $ CERTIFICATE是密钥链全名中的证书名称(双击证书时的通用名称)
  1. 转到要使用辞职证书创建新ipa的目录。将所有文件放在ipa,证书和 mobileprovision并安装证书

  2. 安全cms -D -i path / to / MyProfile.mobileprovision> Provision.plist(调用此命令,并用替换移动配置 文件的路径)

  3. / usr / libexec / PlistBuddy -x -c'Print:Entitlements'Provision.plist> entitlements.plist(单击此命令)

  4. 解压缩-q * .ipa

  5. rm -rf有效载荷/ *。app / _CodeSignature /

  6. / usr / libexec / PlistBuddy Payload / *。app / Info.plist(此命令后,如果我们不需要更改捆绑包,则必须添加新的捆绑包ID id然后我们可以忽略这3个步骤)

7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
  1. cp $ PROVISION有效载荷/ *。app / embedded.mobileprovision

  2. codesign -d --entitlements:entitlements.plist有效负载/ *。app /((如果应用无法使用,请尝试忽略此命令,然后下次使用 该命令)

  3. codesign -f -s“ $ CERTIFICATE”-权利entitlements.plist有效负载/.app/Frameworks /

  4. codesign -f -s“ $ CERTIFICATE”-权利entitlements.plist有效负载/ *。app /

  5. zip -qr resigned.ipa有效载荷

https://stackoverflow.com/a/37172815 https://stackoverflow.com/a/50392448 https://coderwall.com/p/qwqpnw/resign-ipa-with-new-cfbundleidentifier-and-certificate

答案 10 :(得分:0)

如果您的 APP 是使用 Flutter 工具构建的,请检查所有 Pod 扩展的 codesign 信息:

codesign -d --verbose=4 Runner.app/Frameworks/xxx.framework |& grep 'Authority='

结果应该是您团队的名称。

运行下面的 shell 脚本来 codesign 所有扩展:

IDENTITY=<prefix of Team ID number>
ENTITLEMENTS=<entitlements.plist>
find Payload/Runner.app -type d -name '*framework' | xargs -I '{}' codesign -s $IDENTITY -f --entitlements $ENTITLEMENTS {} 

最后不要忘记codesign Runner.app 本身

答案 11 :(得分:0)

您可以使用 XReSign 应用程序(一个简单的 GUI 工具)为您的 ipa 重新签名,我使用它为我的企业分发应用程序重新签名并且运行良好

https://github.com/xndrs/XReSign

你只需要

  1. ipa 辞职
  2. 移动配置
  3. 权利(要生成权利,请检查以下步骤)
  4. 企业经销证书

生成权利:

打开终端

$ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist

然后

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

谢谢

答案 12 :(得分:-1)

如果您的应用包含扩展程序和/或监视应用,并且每个扩展程序/监视应用程序都有多个配置文件,那么您应该使用此脚本重新签名ipa文件。

Re-signing script at 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选项来添加其他扩展配置文件。

对我来说 - 所有配置文件都使用相同的证书/签名身份进行签名。