供应配置文件中 plist 周围的二进制数据是啥?

Posted

技术标签:

【中文标题】供应配置文件中 plist 周围的二进制数据是啥?【英文标题】:What is the binary data around the plist in a provisioning profile file?供应配置文件中 plist 周围的二进制数据是什么? 【发布时间】:2012-03-31 19:34:35 【问题描述】:

.mobileprovision 文件的结构如下所示:

<!-- small binary data -->

<?xml version="1.0" encoding="UTF-8"?>
<!-- plist data -->
</plist>

<!-- large binary data -->

我对此有几个问题:

    这是什么二进制数据? 有用吗? 如何在不搜索 XML 边界的情况下从 .mobileprovision 文件中提取 plist?

具体来说,当上述 Q1 和 Q3 都得到回答时,我会认为这个问题已得到回答(并奖励 +100 赏金)。

【问题讨论】:

【参考方案1】:

我终于在 SO 上从an answer to another question 那里得到了答案。

.mobileprovision 文件基本上是一个CMS 加密的 XML 文件。它可以在 OS X 上使用security 解码:

security cms -D -i /path/to/profile.mobileprovision

【讨论】:

您从该方法获得的信息也可以通过在文本编辑器中打开 mobileprovision 来获得。在 XML 之后,有一块额外的数据,使用 security 将无法解码。 我知道;这正是我问这个问题的原因。我想要的是一种可编程/可编写脚本的方式,只获取 XML 而没有别的。【参考方案2】:

我没有回答您最初的问题,但我可以解释如何从 .mobileprovision 文件中提取签名证书:

    .mobileprovision 的 plist 部分有一个键“DeveloperCertificates”,其值是一个 NSData 数组。 每个 NSData 都是一个 .cer 文件 - 您正在寻找的签名证书。

我有一个简短的 shell 脚本,用于直接从 .mobileprovision 文件中提取签名证书的主题:https://gist.github.com/2147247 - 该脚本仅适用于前面提到的数组中的一个证书,这应该是常见的情况。

正如你在脚本中看到的,我没有回答你的第三个问题,我只是删除了第一行和结束标记之后的所有内容。

【讨论】:

非常感谢。虽然正如你所说,它没有回答最初的问题,但它仍然非常有用——我终于了解到“DeveloperCertificates”密钥中的证书是 x509 证书,这是我打算在 SO 上问的 ;-) 谢谢你。【参考方案3】:

使用

security cms -D -i /path/to/profile.mobileprovision

如果您收到错误消息security: SecPolicySetValue: One or more parameters passed to a function were not valid,只需将错误发送到/dev/null

security cms -D -i /path/to/profile.mobileprovision 2> /dev/null

【讨论】:

【参考方案4】:

.mobileprovision 文件是DER encoded ASN.1,

plist 是存储在此 ASN.1 消息中的值之一。

【讨论】:

【参考方案5】:

该文件基本上是公共分发密钥 + Apple 公共证书链 + 可以安装到的允许设备 - 只要 IPA 文件同样经过签名。

您的密钥被编码到 plist 条目中。 plist 之后的二进制数据是相关的公共证书:Apple Root 公共证书(可从Apple 和 Apple iPhone 证书颁发机构下载(可通过您的 Apple 门户下载)。

[根据cmets更新]

真正的目标是计算出使用我的移动配置文件的证书“通用名称”,以便可以重新签署应用程序。

在移动配置文件ApplicationIdentifierPrefix 标签内包含证书用户ID。此编号可用于在钥匙串工具中查找证书。

所以手动,步骤是:

    从 .mobileprovision 文件中提取 ApplicationIdentifierPrefix 号码 打开钥匙串应用程序。查看每个登录名/证书以找到具有匹配 UserId 的登录名/证书

自动化流程

    运行一些花哨的 unix 命令来提取 ID 运行 security find-certificate -a &gt;a.out 然后 grep 获取 ID。然后从同一记录中找到通用名称。

【讨论】:

基本上我想用不同的配置文件辞职一个应用程序。我想知道,我们是否可以从新的配置文件本身中提取签名证书信息,而不是明确指定证书名称来为应用程序签名。查看 .mobileprovision 文件的内容让我想到了这一点。 如何从这个文件中只提取 plist 信息? AFAIK 你不能辞职——因为你必须在 XCode 编译期间对二进制文件进行签名,然后是最终的 IPA。尽管后者可能只是将 XX.mobileprovisiong 文件作为embedded.mobileprovisioning 添加到应用程序包中。所以你的情况是你有一个二进制 IPA/APP 但没有源? 这个document 对如何管理供应安全性进行了很好的分析。 不,我没有查看 ipa 中的 plist 文件。我们的部署过程是这样的——我们嵌入了一个带有临时配置文件的应用程序以进行 beta 测试。如果 Beta 测试顺利,我们只需使用 xcrun 命令使用应用商店配置文件退出同一个应用。现在,此命令的相关咒语要求我提供 both 配置文件和签名证书名称。由于配置文件确实包含签名证书信息,我想知道我们是否可以避免编写这些信息。

以上是关于供应配置文件中 plist 周围的二进制数据是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Plist:它是啥以及如何使用它

如何从配置文件中提取捆绑标识符?

使用 Python 读取二进制 Plist 文件

Google Play Expo w/ React - Expo 的 app.json 文件中与 Android 对应的 plist 是啥?

供应商文件夹中的 symfony 是啥?

iOS 开发中 Info.plist 变量的最佳实践是啥?