如何重新签名ipa文件?


107

生成如下所示具有不同配置文件的IPA之后,如何用配置文件对.ipa文件签名?我想使用临时配置文件对IPA进行Beta测试,然后使用应用商店的应用程序提交配置文件对确切的IPA重新签名。

/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}"

Answers:


207

从命令行非常容易做到。我有这样做的要旨。现在,它已被合并到我每天使用的https://github.com/RichardBronosky/ota-tools中的ipa_sign脚本中。如果您对使用这些工具有任何疑问,请随时提出。

它的核心是:

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

您的新签名应用程序称为resigned.ipa


31
7票赞成,而不是一个问题。我想我的打击很清楚。
布鲁诺·布罗诺斯基

4
的确,先生。
瑞佩雷斯2013年

3
@RahmathullahMPulikkal我看到我在要点中错误地硬编码了一条路径。您确实应该使用github.com/RichardBronosky/ota-tools/blob/master/ipa_sign而不是要旨。这是维护的代码。
布鲁诺·布罗诺斯基

5
您可能会在--resource-rules参数上收到警告/错误,该参数已在OS X Yosemite(10.10)中弃用,只需删除此参数即可解决此问题。
ıɾuǝʞ

4
一个小提示:它看起来像CodeResources现在位于内部的的_CodeSignature文件夹,所以你只需要删除该文件夹。
dadude999

36

iResign上查看有关如何执行此操作的简便工具!

经过一番摸索之后,我找到了一种解决方案,可以识别钥匙串辞职。您可以在https://gist.github.com/Weptun/5406993上查看


有没有什么工具可以在辞职时更改“显示名称”和“绑定ID”?这将有助于为不同的环境使用不同的显示名称。如App-Dev,App-QA,App-Stage等
Nishanth Nair

1
是的,floatsign.sh正是这样做的。
Blitz

作品。简单而美丽。
Arjun Kalidas '18

13

有点老问题了,但是有了最新的XCode,这codesign很容易:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement

2
@Pavel当iOS 6.x是最新版本时,回答了这个问题。从那时起,我们发布了两个主要版本,这些版本显然改变了许多事情。您可能希望将搜索范围限制为针对当前技术的答案。
BryanH 2015年

它为我工作。您必须用密钥链中密钥的名称替换“ my_certificate”。
Franziskus Karsunke,2015年

2
codesign该命令也用于@BrunoBronosky响应中。我无法直接在“ * .ipa”文件上使用它,并且“ -vv”选项始终会code object is not signed at all在我知道它们已签名的文件上返回……
Mariano Paniga 2015年

12

在这里发布的答案对我来说都不是很有效。他们主要跳过签名嵌入式框架(或包括权利)。

这是为我工作的内容(假设当前目录中存在一个ipa文件):

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/

上面的帖子(丰富)的有用评论:stackoverflow.com/questions/5160863/…–
Serzas,

9

Fastlane的叹息为辞职IPA提供了一个相当强大的解决方案。

从他们的自述文件中:

辞职

如果您生成了ipa文件,但想对ipa文件应用其他代码签名,则可以使用sigh resign

fastlane sigh resign

sigh 如果它们位于当前文件夹中,则会为您找到ipa文件和配置文件。

您可以使用命令行传递更多信息:

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

它甚至可以处理嵌套应用程序的配置文件(例如,如果您有watchkit应用程序)


8

我已经为我的Sierra iMac更新了Bryan的代码:

# 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

我混入了以下错误entitlements.plist:无法识别的blob类型(盲目接受)entitlements.plist:权利blob中的长度无效
Amr Angry

您可以共享您的权利文件内容吗?
皮埃尔·普里奥

像魅力一样工作!
路易斯·普拉多

5
  1. 通过使用.zip更改扩展名来解压缩.ipa文件
  2. 转到有效负载。您会找到.app文件
  3. 右键单击.app文件,然后单击“显示包内容”
  4. 删除资料_CodeSigned
  5. embedded.mobileprovision新的配置文件替换文件
  6. 转到KeyChain Access并确保存在与临时配置文件关联的证书
  7. 执行以下命令: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. 现在再次压缩Payload文件夹,并使用.ipa更改.zip扩展名

希望对您有所帮助。

供参考,请参见下面提到的链接:http : //www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/


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.