如何判断使用啥配置文件/签名证书来签署 .ipa?
Posted
技术标签:
【中文标题】如何判断使用啥配置文件/签名证书来签署 .ipa?【英文标题】:How to tell what profile/signing certificate was used to sign .ipa?如何判断使用什么配置文件/签名证书来签署 .ipa? 【发布时间】:2013-01-30 15:02:30 【问题描述】:我有一堆 .ipa 文件,并且我使用脚本将它们辞职。
那么如何检查配置文件/签名证书以确保他们使用正确的信息?
理想情况下,我希望能够获取任何 .ipa 文件并告诉使用哪个配置文件/签名证书对其进行签名。
背景故事:我们的企业分发证书即将到期,我想重新签署我们的资料。对于我们在 Xcode 中制作和存档的所有东西来说,这是一个简单的做法,但对于第 3 方供应商制作的可分发文件,我不能这样做。我想避免要求重新签名的 .ipa 文件,因为新的 .ipa 可能包含未知更改并引入问题,他们可能也会向我们收费......但我更担心第一个问题。
由于我们的旧分发证书和新分发证书仍然有效(您有 6 个月的重叠),我需要能够确认使用了新分发证书,否则当旧分发证书过期并且“辞职”时我会看起来很傻脚本实际上并没有完成这项工作。
【问题讨论】:
【参考方案1】:据我所知,以上内容都无法立即告诉我是否使用了某个分发证书。
以下对我有用。
首先,打开 Keychain Access,过滤 Certificates,找到 iPhone 分发证书。
右键单击分发证书并选择获取信息。将出现一个新窗口。
将此十进制序列号转换为十六进制,例如通过选择并复制它,然后将其粘贴到计算器应用程序中(通过菜单 View -> Programmer 切换到程序员模式):
然后在右上角将分段控件切换到“16”:
有了这些知识,打开终端并解压 IPA,然后切换到 Payload 目录:
$ unzip MyApp.ipa
$ cd Payload
提取证书:
$ codesign -d --extract-certificates MyApp.app
显示第一个证书的序列号:
$ openssl x509 -inform DER -in codesign0 -noout -nameopt -oneline -serial
serial=20DE00FFA05EED03
在这种情况下,十六进制序列与上述证书匹配。
【讨论】:
【参考方案2】:聚会迟到了....
但是这个工具为我节省了一些时间:nomad/shenzhen
$ ipa info /path/to/app.ipa
+-----------------------------+----------------------------------------------------------+
| ApplicationIdentifierPrefix | DJ73OPSO53 |
| CreationDate | 2014-03-26T02:53:00+00:00 |
| Entitlements | application-identifier: DJ73OPSO53.com.nomad.shenzhen |
| | aps-environment: production |
| | get-task-allow: false |
| | keychain-access-groups: ["DJ73OPSO53.*"] |
| CreationDate | 2017-03-26T02:53:00+00:00 |
| Name | Shenzhen |
| TeamIdentifier | S6ZYP4L6TY |
| TimeToLive | 172 |
| UUID | P7602NR3-4D34-441N-B6C9-R79395PN1OO3 |
| Version | 1 |
+-----------------------------+----------------------------------------------------------+
2020:维护者更新
https://github.com/nomad/shenzhen/blob/master/README.md
注意:深圳使用 Xcode 6 构建 API,该 API 已弃用近 3 年。如果您的应用使用 Swift 3、watchOS 和其他应用目标,这会导致问题。
使用最新的 Xcode API 构建 ios 应用程序的维护替代方案是gym。要分发构建,您可以使用 fastlane。有关如何开始使用的更多信息,请参阅 iOS Beta 部署指南。
【讨论】:
工具似乎已被弃用好几年了。【参考方案3】:如果您尝试确定是否使用特定证书来签署 .ipa,您可以执行以下操作:
如果您对 python 感到满意,您可以使用我创建的这个脚本来比较嵌入在 .ipa 中的证书与您拥有的证书。
https://gist.github.com/ronsims2/1b7a8b9e15898f9406788988106b2f78
python ipa_cert_checker.py /Users/janedoe/Dcouments/Foobar.ipa /Users/janedoe/Dcouments/barfoo.cer
或者,您可以从 Mac 的命令行手动执行脚本执行的操作。
解压缩 IPA 存档。它将生成一个名为“Payload”的文件夹。
unzip Foobar.ipa
读取嵌入式配置信息。请注意,Payload 目录中的包/文件夹的名称与 .ipa 相同,但扩展名为 .app。
security cms -Di Payload/Foobar.app/embedded.mobileprovision
在上述命令的输出中,证书作为 base64 字符串嵌入到与键“DeveloperCertificates”关联的数组数据元素中。 3. 复制证书(不包括 xml 标签并确保没有多余的空格)并将它们作为文本保存到方便的位置。在本例中,我将其命名为“cert_from_foobar.txt”
Base64 编码已知证书并将输出保存到文件中。
base64 barfoo.cer > barfoo.txt
将已知证书与您保存的嵌入式证书进行比较。
cmp cert_from_foobar.txt barfoo.txt || echo 'These files are NOT the same.'
如果它们相同,您将不会看到任何消息。
【讨论】:
【参考方案4】:Provisioning Profiles 有一个可以使用终端命令查看的 UUID:
安全 cms -D -i (path_to_your_provisioning_profile)
查看命令输出的 UUID 部分,如:
<key>UUID</key>
<string>A008C022-7B82-4E40-8B37-172763E1E3CC</string>
Xcode 会在 .app 包中插入用于签署应用程序的配置文件。要找到它,请将 .ipa 重命名为 .zip,使用 Finder 解压缩,在 /Payload 中找到 .app 文件。在 .app 文件上“显示包内容”并找到名称为 embedded.mobileprovision
的配置文件。
使用上述命令转储其权利,并将其与“库”下的 Xcode Organizer > Devices 选项卡 > Provisioning Profile 部分中的配置文件中找到的 UUID 进行比较。您可以在那些上使用“在 Finder 中显示”来显示它们在磁盘上的位置。
【讨论】:
开始测试很痛苦,但我编写了一个脚本,它需要一个 .ipa 提取配置文件的名称并检查到期日期,以便我能够自动化这可以加快测试速度。所以对我来说……这将是一个更好的解决方案。 该命令行给出输出:“安全性:无法将数据添加到解码器:未知(-8183(d) 总线错误:10” Adam - 确保您正在解码 Embedded.mobileprovision 而不是 ipa 本身。 补充:您如何从开发者门户中查看配置文件的 UDID? 这如何告诉您使用了什么证书?我在这里看到的只是如何识别配置文件【参考方案5】:我最终混合使用了 Bobjt 和 HaemEternal 解决方案提案。
-
查找存档。
显示包内容。
将 .app 文件复制出来
显示 .app 文件的包内容。
将 embedded.mobileprovision 文件复制出来。
运行“security cms -D -i (path_to_your_provisioning_profile)”
从第 6 步的调用结果中查找 UUID 号。
打开 Iphone 配置实用程序并查看配置文件以找到具有相同 UUID 编号的配置文件。
【讨论】:
【参考方案6】:根据 Bobjt 的回答,我使用 IPCU 获取了配置文件的详细信息:
-
将 .ipa 重命名为 .zip
用 Finder 解压
在 /Payload 中找到 .app 文件。
.app 文件上的“显示包内容”并找到名称为 embedded.mobileprovision 的配置文件。
将 mobileprovisioning 文件拖到 iPhone 配置实用程序中
IPCU 显示配置文件的名称/到期日期等。
【讨论】:
如果我没记错的话,这个工具不适用于 iOS >= 8 @gnichola 你不需要连接 iPad / iPhone 来执行这些步骤,所以 iOS 版本应该是无关紧要的。 我想我的评论可能更清楚,如果您有可以使用它的工具,我的问题是,由于该工具适用于较旧的操作系统版本,它不再可用,或者至少当我在寻找它时,我找不到它。 您仍然可以在 El Capitan 上下载并安装它,尽管您必须从网络(而不是应用商店)下载它。或者,您可以在 TextEdit 中打开配置文件并检查“ExpirationDate”和“Name”等键【参考方案7】:我已经能够使用以下过程成功测试。
-
将原始 .ipa 安装到设备上。
转到设置->常规->配置文件(请参阅旧配置文件)
从设备中删除应用和旧配置文件
辞职应用。
在设备上安装重新签名的应用
转到设置->常规->配置文件(请参阅新的配置文件)
这似乎是一种确认配置文件已更新的防弹方法,并且由于配置文件中只有 1 个签名证书...那么我们必须使用新证书进行签名。
(但我还是想找到更好的方法)
【讨论】:
以上是关于如何判断使用啥配置文件/签名证书来签署 .ipa?的主要内容,如果未能解决你的问题,请参考以下文章
证书上的“签名算法”到底是啥意思?使用哪种签名算法来签署我的证书?
如何在没有 Apple 开发者帐户的情况下重新签署 IPA 文件
使用同一帐户的分发证书和配置文件重新签署开发 IPA 时是不是需要 entitlement.plist 文件?