揭秘iOS签名

欢迎来到救援区。 如果您走到了这一步,那可能是因为您发现自己为苹果的iOS签名过程及其周围的混乱而咒骂苹果。 保持镇定,我们都去过那里并幸存下来。

这不是另一本使用方法文章。 这些周围很多。 在这里,我将尝试绘制更高级别的有关iOS签名工作方式的图片。 当事情进展得不太顺利并且您需要排除错误时,获取流程的心理模型非常有用。

本文是在2019年3月撰写和发布的。当前版本是XCode 10.2。 这一点很重要,因为Apple会不断更改其签名方法和功能,因此在某些时候,本文也会过时。

为什么要签名

(这有什么好处?如果您已经确信签名很重要,请跳过此步骤)。

需要对应用程序进行签名有两个原因:

  • 为了允许Apple在每个应用可供用户使用之前对其进行授权,并对该应用进行签名,可以确保该应用不会被恶意人员修改,并且您的应用中没有恶意代码。
  • 为了使Apple通过限制只能在Mac上运行的版本以及向其开发者的帐户许可证收费来赚钱。

苹果公司的“封闭花园”理念驱使他们不仅限制从App Store下载的应用程序,还限制设备上安装的所有内容。 因此,如果您现在是为猫构建漂亮的闪亮Tinder的开发人员,则除非获得Apple的明确签名许可,否则您将无法在设备上安装它。

这就是整个应用程序签名神秘过程的起点。

签署实体

(iOS签名地狱的参与者)

Apple需要了解三件事,以允许您在任何设备上安装任何应用程序:谁? 什么? 哪里?

  1. 谁—证书将标识所有者
  2. 什么—开发和安装应用程序
  3. 位置-将在哪些设备上安装应用程序。

让我们从简单的一个开始:

设备标识符

唯一设备标识符( UDID )是分配给Apple设备的40个字符的字符串。 在Mac中,可以通过访问硬件信息找到它。 在iPhone / iPad上,该站点可以帮助找到它:http://whatsmyudid.com/

接下来是确定的应用程序。 这是您可以弥补的:

应用程序标识符(应用程序ID /捆绑ID)

这是标识您的应用程序的密钥。 通常将应用程序ID作为域的相反顺序,例如com.company.app。 应用程序ID由团队拥有,因此需要在团队开发人员门户上进行注册。

需要在团队的开发人员门户上注册应用程序ID。 每个应用程序还指定要使用的Apple服务。 此类服务可以是推送通知(通过APS→Apple Push Services。只有Apple可以将通知推送到设备),iCloud,Siri等。

[准确地说,com.company.app称为捆绑包ID。 应用ID是团队标识和捆绑ID的组合,例如ABCD1234.com.company.app]

最复杂的是证书。

证书

证书的目的是验证一个人或一个团队是否是该应用程序的真正所有者,并且其身份不能被他人盗用。 一个人可以通过其Apple ID来识别,也可以属于一个团队。

在Apple Developer Portal上创建了一个开发团队,管理员可以向其中添加其他开发人员。 添加开发人员(具有某些特权)意味着团队管理员信任他们代表他分发应用程序。

在供应门户上定义了一个新应用程序,用户正在成为该应用程序的所有者。 但是,有人如何判断某个应用程序是否实际上仅由该用户修改? 为此,用户可以生成签名证书。 签名证书的工作原理(非常宽松)就像破碎的心形项链。 苹果持有项链的一半,而用户在更改应用程序时需要出示另一半,以便苹果知道自己是谁。

证书由8个字符的字符串标识,并且还包含证书持有者(开发人员或团队)的名称。 有两种类型的证书:

  • 开发人员证书是为特定人员或实际上是一个Apple ID生成的,并且可以在开发期间使用(我们稍后会看到如何使用)
  • 顾名思义, 分发证书允许为非开发人员的用户分发应用程序。 经认证的发行版本将生成到组织或团队(可能只有一个人)。

供应配置文件

(将它们放在一起)

如上所述,苹果公司希望确保在哪个设备上安装了什么软件。 配给配置文件是所有内容组合在一起的地方:它告诉谁是授权用户,什么是应用程序以及可以使用哪些设备。

在应用程序开发的不同阶段中使用了4种不同类型的配置文件:

  • 开发 -用于使开发人员在开发过程中将开发过程中的应用程序安装到特定设备上。 该设备需要连接到开发计算机。 此供应配置文件正在使用开发证书,并且将要注册和安装将要使用的设备。
  • 临时 -这使用户可以将应用程序安装在已知数量有限的设备上以进行测试。 这些设备不需要物理连接到开发计算机,但是需要知道它们并在开发门户网站上注册。 尽管此配置文件是使用分发证书的,但使用即席配置文件签名的应用程序无法上载到App Store。
  • App Store-这是用于将应用程序分发到App Store的供应配置文件。 它使用分发证书,但不仅限于特定的设备。
  • 企业 -第四种类型的配置文件适用于希望控制哪些应用程序限制在其用户设备上的大型组织。 它需要加入Apple Enterprise计划(是的,更多钱!),并且正在使用特殊注册。

每个配置文件都有一个唯一的标识符。配置文件已签名并嵌入到应用程序中,但是简短的搜索将告诉您如何从打包的IPA中提取它。

Provisioning文件本身已签名,不能仅通过查看文件来查看,但是由于这个家伙https://github.com/ealeksandrov/ProvisionQL,您可以安装一个finder附加程序,向您显示其中的所有信息容易。

签名验证过程

(他们怎么办?)

最后一部分将以很高的层次说明供应配置文件验证的工作方式。 但是首先让我们谈谈此过程涉及的2种工具:

  • 钥匙串是一种安全的保险箱,它知道如何存储秘密物品(实际上,这是用于Apple安全的openssl协议的不错的UI)。
  • XCode构建工具(和UI)知道如何使用正确的签名配置文件对应用程序进行签名。

步骤1 —生成签名证书

  • 授权用户登录到开发人员门户并为其请求签名证书。
  • 用户在本地生成私钥(心碎的一半),并通过开发人员门户将其反映发送给Apple。
  • Apple根据签名的私钥创建证书(伤心的另一半)。
  • 新创建的证书已安装在用户的开发计算机中。 该证书仅在与已签名的私钥配对时才有效。

第2步-生成配置文件

  • 唱歌证书已在门户网站上注册,现在用户可以登录到门户网站并请求供应配置文件。 用户指定应用程序和请求的配置文件的类型。
  • 对于开发或临时设置配置文件,用户从已注册设备列表中指定设备。
  • 对于开发供应配置文件,用户可以定义一组可以使用相同供应配置文件的有效开发证书。
  • 用户将供应配置文件下载到开发机器。 存储配置文件的默认位置是〜/ / MobileDevice / Provisioning Profiles。

步骤3 —构建应用程序

  • 在开发计算机上构建并签名应用程序。 使用适合xcode签名属性中指定内容的配置文件完成签名。

对于调试签名,需要具有开发证书的配置文件,对于发布签名,则需要分发证书。 当然,只能使用针对所构建的特定应用程序生成的供应配置文件。

如果该应用程序旨在用于App Store分发,则需要通过iTunes Connect门户上载。 具有除App Store之外的任何配置文件的App将被拒绝。

如果您使用自动签名,则XCode会尝试找到合适的配置文件,但是如果找不到,它将仅访问开发人员门户API并根据构建类型生成新的API。

步骤4 —安装应用程序

当用户尝试安装应用程序时,将发生最后一步。

  • 如果该应用程序在获得批准后从App Store下载,则可以安装在任何设备上(存在一些限制,例如区域限制,但暂时将被忽略)。
  • 如果应用程序是Ad Hoc或Development,则尝试在设备上安装时,将检查UDID,并且安装将被批准或拒绝。

快车道

(我们可以避免混乱吗?)

如果您在组织中使用iOS应用程序已有一段时间,那么您可能已经了解Fastlane。 Fastlane具有多种工具(操作),可以简化构建iOS和Android应用程序的过程。

Fastlane工具使您无需访问开发人员门户即可执行证书和置备配置文件的生成。 它使您可以使用共享的git存储库(例如Github上的git存储库)在团队中的用户之间共享配置文件,这甚至更加有用。 团队使用的所有证书都将存储在git存储库中,用户可以使用它们来构建其应用程序,而无需访问开发人员门户。

Fastlane文档对于每个操作都非常全面,但是在解释概念上有些欠缺。 知道Fastlane有3个与iOS签名相关的操作是很有用的:

  • 证书( get_certificates别名)-允许管理证书配置文件
  • get_provisioning_profileget_provisioning_profile别名)-允许管理证书配置文件
  • 匹配( sync_code_signing别名)—允许将证书和供应配置文件与证书和供应配置文件的集中管理存储库同步。

有了这种了解,您现在可以返回Fastlane文档并了解有关不同选项的更多信息。

摘要

我既不是黑客,也不是安全专家。 我对iOS签名的第一次体验很恐怖。 我在钥匙串上注意到了我公司的团队证书,并确保不小心删除将使我们的应用程序访问权永远消失。 事实是,本地执行的任何操作都不能以不可逆的方式损害应用程序。 更糟的是,您将需要生成一个新的配置文件或证书。 (注意:开发人员门户和iTunes Connect可能具有更大的破坏力)。

如果本文减轻了您对Apple签名的焦虑程度,并有助于澄清问题。 如果您发现了一些可怕的错误,请指出来。 我不想误导人们。 如果您觉得有帮助,欢迎您拍手和/或分享。