如何重新签名ipa文件?

121

如何在使用不同的配置文件生成IPA文件后,使用一个配置文件对其进行签名? 我想使用Ad-Hoc配置文件对IPA文件进行签名以进行测试,然后使用App Store提交的配置文件重新签名完全相同的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}"

1
可能是重新签名IPA(iPhone)的重复问题。 - InnisBrendan
9个回答

217

从命令行进行这个操作真的很容易。我有一个脚本的要点可以实现这个功能。这个脚本现在已经被合并到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。


35
7个赞,却没有一个问题。我猜我的Bash脚本写得太清楚了。 - Bruno Bronosky
3
我看到我在 gist 中错误地硬编码了一个路径。你应该使用 https://github.com/RichardBronosky/ota-tools/blob/master/ipa_sign 而不是gist。这是维护的代码。 - Bruno Bronosky
5
在OS X Yosemite(10.10)中,“--resource-rules”参数已被弃用,您可能会收到警告/错误提示。只需删除此参数即可解决此问题。 - ıɾuǝʞ
4
一个小提示:看起来 CodeResources 现在位于 _CodeSignature 文件夹内部,所以你只需要删除那个文件夹即可。 - dadude999
2
今天对我有用的是:执行 security find-identity -v 命令来确定您签名身份的 ID。然后,调用 /usr/bin/codesign --force -s YOUR_IDENTITY -v Payload/*.app 命令来实际对应用进行签名。 - Gene
显示剩余23条评论

39

有没有工具可以在重新签名时更改显示名称和捆绑标识符?这将有助于在不同的环境中拥有不同的显示名称,例如App-Dev、App-QA、App-Stage等。 - Nishanth Nair
1
是的,floatsign.sh 正是这样做的。 - Blitz
可用。简单而美观。 - Arjun Kalidas

16

这个问题有点老了,但是最新的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
1
它对我起作用了。你必须用你密钥链中的密钥名称替换“my_certificate”。 - Franziskus Karsunke
2
“codesign” 命令也被用在 @BrunoBronosky 的回答中。我无法直接在 "*.ipa" 文件上使用它,而且 "-vv" 选项总是返回 code object is not signed at all,即使我知道这些文件已经签名了... - Mariano Paniga

16

这里发布的答案对我来说都不太适用。它们主要跳过了签名嵌入式框架(或包括权益)。

以下是对我有效的方法(假设当前目录下存在一个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/

1
上面帖子中有用的评论(Rich):https://dev59.com/Am435IYBdhLWcg3w4UQc#asvnnYgBc1ULPQZFo3C9 - Serzas
1
这是很好的下一步,但缺少扩展的签名。我在应用程序签名之前添加了一行代码:codesign -f -s“$ CERTIFICATE”--entitlements entitlements.plist Payload / * .app / Plugins / * - Pat
@Pat,如果应用程序有不同的规定怎么办? - Eugene Biryukov
我想你需要为每个扩展创建一个权限映射或关联。也许可以创建一个文件夹,其中包含扩展名和相应的权限,以外部存储的方式,这样就可以通过循环遍历扩展并按扩展名引用相应的权限了。 - Pat

15

Fastlane的sigh为重新签名IPA提供了相当强大的解决方案。

以下是它们README中的内容:

重新签名

如果您已经生成了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
你能分享你的授权文件内容吗? - Pierre Priot
运行得非常顺利! - Luis E. Prado

6
  1. 通过更改后缀为.zip的方式解压.ipa文件
  2. 进入Payload文件夹,您将找到.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 文件夹,然后将 .zip 扩展名改为 .ipa

希望这对您有所帮助。

请参考以下链接: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/


1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接