签署应用商店出口的IPA与开发证书



问题

是否可以使用开发证书和配置文件重新签署/配置为AppStore导出的IPA?

我可以进行实际的辞职,并且在手动验证后一切似乎很好,但是我在启动时尝试的任何应用程序都会崩溃。我不是要重新签署从AppStore下载的应用程序,这些是在我的计算机上构建的应用程序。

似乎没有一个流行的工具做对了。有没有人曾经做到这一点,或者由于某种原因是不可能的?

发现

在设备日志中,我没有看到应用程序进程本身报告的任何内容,因此操作系统必须在启动之前杀死它。我确实看到了这个:

securityd[101] <Notice>: cert[0]: CheckLeafMarkerOid =(leaf)[]> 0
securityd[101] <Notice>: cert[0]: SubjectCommonName =(leaf)[]> 0
securityd[101] <Notice>: cert[0]: IssuerCommonName =(path)[]> 0
amfid(Security)[196] <Notice>:  [leaf CheckLeafMarkerOid IssuerCommonName SubjectCommonName]
amfid(libmis.dylib)[196] <Info>: Blacklist does not exist.
amfid(libmis.dylib)[196] <Info>: Using empty blacklist.
amfid(libmis.dylib)[196] <Info>: CreateMISAuthListWithStream: open stream failed (may be non-existing)
amfid(libmis.dylib)[196] <Info>: CreateMISAuthListWithStream: creating empty auth list
assertiond[66] <Notice>: Unable to obtain a task name port right for pid 1683: (os/kern) failure (5)
SpringBoard(FrontBoard)[57] <Error>: Unable to register for exec notifications: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to get short BSD proc info for 1683: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to get proc info for 1683: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to obtain a task name port right for pid 1683: (os/kern) failure (0x5)
SpringBoard(BaseBoard)[57] <Error>: Unable to get short BSD proc info for 1683: No such process
SpringBoard(FrontBoard)[57] <Error>: Unable to obtain a process handle for <FBApplicationProcess: 0x10bc26cd0; com.company.product.name; pid: 1683>

这似乎表明应享权利存在问题。但是,当我从我安装的 IPA 手动打印它们 (/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i "$1"/embedded.mobileprovision) > entitlements.plist ( 时,我有:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>TEAMID.*</string>
<key>com.apple.developer.default-data-protection</key>
<string>NSFileProtectionComplete</string>
<key>com.apple.developer.team-identifier</key>
<string>TEAMID</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>TEAMID.*</string>
</array>
</dict>
</plist>

这清楚地表明get-task-allow权利是正确的。

工具

无论我尝试哪种工具,我最终都会得到相同的结果,例如

  • https://dantheman827.github.io/ios-app-signer/
  • https://github.com/nowsecure/node-applesign
  • https://github.com/fastlane/fastlane/blob/master/sigh/lib/assets/resign.sh

类似问题

  • 我们可以使用我们的开发证书重新签署应用商店构建吗?简单的没有答案,似乎不正确,因为我能够在没有警告或错误的情况下执行实际的辞职操作。
  • 将 iOS 应用从分发标识签名为开发人员标识演示如何验证和/或调整已签名的 IPA 中的最终权利。
  • iOS 使用开发者资料从应用商店中退出 IPA问题有点旧,但其中一位评论者最终报告了相同的观察到的行为:"但它无法正常运行,它闪回。直到现在我都不知道"。

更新 1

(对@Yoshkebab的反应(

otool 的输出表明二进制文件未加密:otool -l App/Payload/App.app/App | grep -A 4 -i encrypt

cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 0
cryptsize 0
cryptid 0
--
cmd LC_ENCRYPTION_INFO_64
cmdsize 24
cryptoff 0
cryptsize 0
cryptid 0

但是,例如霍珀无法拆卸它...苹果在Xcode中应用加密是否有任何参考?这表明他们在用户的系统上有一个那个密钥?此外,我没有看到可以指示这一点的构建步骤(协同设计只是添加签名,不是吗?

Clutch 无法看到我的应用程序,Stefan Esser的转储解密库不起作用,因为我怀疑该应用程序立即崩溃(我的设置正常,因为它适用于其他应用程序(。

AppStore 签名的应用程序不仅由开发者的证书签名,而且二进制文件也由 Apple 的私钥加密。 因此,您可以重新签名应用程序,但除非您解密二进制文件,否则您将无法运行它们。 查看二进制文件的LC_ENCRYPTION_INFO加载命令(最简单的方法是使用MachoView(,如果您看到一个标志Crypt ID != 0,则二进制文件已加密。

假设是这样,您仍然可以这样做,这有点乏味,您需要安装该应用程序的越狱设备。

  1. 使用 SSH 连接到您的设备。与甘道夫一起使用的最简单方法
  2. 获取 Clutch 并将其安装在您的设备上 - 按照他们的说明进行操作(我发现编译它的最简单方法是更改包名称(
  3. 解密的应用程序转储到新的 IPA 中(离合器 -d "YOUR_PACKAGE_ID"(

现在您有一个解密的 IPA,您可以辞职

最新更新