【问题标题】: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 个月的重叠),我需要能够确认使用了新分发证书,否则当旧分发证书过期并且“辞职”时我会看起来很傻脚本实际上并没有完成这项工作。

【问题讨论】:

    标签: ios xcode certificate code-signing ipa


    【解决方案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 的命令行手动执行脚本执行的操作。

      1. 解压缩 IPA 存档。它将生成一个名为“Payload”的文件夹。

        unzip Foobar.ipa

      2. 读取嵌入式配置信息。请注意,Payload 目录中的包/文件夹的名称与 .ipa 相同,但扩展名为 .app。

        security cms -Di Payload/Foobar.app/embedded.mobileprovision

      在上述命令的输出中,证书作为 base64 字符串嵌入到与键“DeveloperCertificates”关联的数组数据元素中。 3. 复制证书(不包括 xml 标签并确保没有多余的空格)并将它们作为文本保存到方便的位置。在本例中,我将其命名为“cert_from_foobar.txt”

      1. Base64 编码已知证书并将输出保存到文件中。

        base64 barfoo.cer > barfoo.txt

      2. 将已知证书与您保存的嵌入式证书进行比较。 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 解决方案提案。

        1. 查找存档。
        2. 显示包内容。
        3. 将 .app 文件复制出来
        4. 显示 .app 文件的包内容。
        5. 将 embedded.mobileprovision 文件复制出来。
        6. 运行“security cms -D -i (path_to_your_provisioning_profile)”
        7. 从第 6 步的调用结果中查找 UUID 号。
        8. 打开 Iphone 配置实用程序并查看配置文件以找到具有相同 UUID 编号的配置文件。

        【讨论】:

          【解决方案6】:

          根据 Bobjt 的回答,我使用 IPCU 获取了配置文件的详细信息:

          1. 将 .ipa 重命名为 .zip
          2. 用 Finder 解压
          3. 在 /Payload 中找到 .app 文件。
          4. .app 文件上的“显示包内容”并找到名称为 embedded.mobileprovision 的配置文件。

          5. 将 mobileprovisioning 文件拖到 iPhone 配置实用程序中

          IPCU 显示配置文件的名称/到期日期等。

          【讨论】:

          • 如果我没记错的话,这个工具不适用于 iOS >= 8
          • @gnichola 你不需要连接 iPad / iPhone 来执行这些步骤,所以 iOS 版本应该是无关紧要的。
          • 我想我的评论可能更清楚,如果您有可以使用它的工具,我的问题是,由于该工具适用于较旧的操作系统版本,它不再可用,或者至少当我在寻找它时,我找不到它。
          • 您仍然可以在 El Capitan 上下载并安装它,尽管您必须从网络(而不是应用商店)下载它。或者,您可以在 TextEdit 中打开配置文件并检查“ExpirationDate”和“Name”等键
          【解决方案7】:

          我已经能够使用以下过程成功测试。

          1. 将原始 .ipa 安装到设备上。
          2. 转到设置->常规->配置文件(请参阅旧配置文件)
          3. 从设备中删除应用和旧配置文件
          4. 辞职应用。
          5. 在设备上安装重新签名的应用
          6. 转到设置->常规->配置文件(请参阅新的配置文件)

          这似乎是一种确认配置文件已更新的防弹方法,并且由于配置文件中只有 1 个签名证书...那么我们必须使用新证书进行签名。

          (但我还是想找到更好的方法)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-23
            • 2013-02-22
            • 2015-04-23
            • 2014-05-15
            • 2017-11-28
            • 2021-12-04
            • 2017-04-17
            • 2013-05-16
            相关资源
            最近更新 更多