如何判断使用啥配置文件/签名证书来签署 .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 文件?

从 .ipa 文件中检索证书到期日期?

ios企业证书导出的P12和对应的描述文件,可以签名ipa吗?

ios 如何检查ipa是被重签名过的