简化了iOS代码签名和设置流程

如果您曾经是iOS开发人员,那么肯定会在某些时候让您理解签署和部署应用程序这一相对复杂的过程。

捆绑标识符,置备配置文件,App ID或证书签名请求等有很多其他非常规术语,而所有这些之间的纠缠使整个过程变得如此复杂。

在本文中,我们将尝试理解并涵盖以下主题:

1.代码签名

2.供应流程

3.应用部署

A.与供应和代码签名有关的主要术语:

首先,让我们了解您在尝试对签名,部署和应用进行编码时将重复使用的基本术语。

1. Xcode和会员中心

Xcode是IDE,与XCode相关的任何帮助:http://help.apple.com/xcode/mac/9.0/

会员中心是我们可以在其中创建配置文件,应用程序ID,证书等的门户。会员中心的一些功能直接与Xcode结合在一起。 例如,您可以在Xcode设置中查看和创建您的签名身份,或者下载和刷新预配配置文件。

在注册了Apple Developer Program之后,您将能够登录会员中心。

2.签署身份

通过对应用程序进行签名,iOS可以识别谁对您的应用程序进行了签名,并可以验证自从您对应用程序进行签名以来未对其进行修改。 签名身份由Apple为您创建的公私钥对组成。 将公钥视为仅锁定机制,因此您需要知道私钥才能再次展开,解锁或解码数据。

3.公钥和私钥,企业社会责任和钥匙串应用

公钥和私钥对来自哪里,您如何请求包含它们的证书? 通过“钥匙串访问”应用程序创建证书签名请求(CSR)时,所有这些都会发生。 如果这样做,“钥匙串应用程序”将创建一个私钥和一个certSigningRequest文件,然后将其上传到Apple。 Apple将验证该请求并为您颁发证书(如果会员中心由您的团队管理员管理,CSR的接受和证书的创建由团队管理员[证书颁发机构或CA]管理)。

4.证书

这是Apple授予的加密证书。 它的工作原理与SSL相似,在SSL中,您获得由权威机构签名的证书。 Apple签署了用于对应用程序的不同部分进行签名的私钥。 不同的证书创建不同类型的信任。 有些允许您签名并提交应用程序到App Store,而另一些允许您的应用程序的Web服务器通过APNS向用户发送推送通知。

证书将包含可以下载到系统的公共密钥。 下载后,您需要双击将其放入“钥匙串访问应用程序”。 加密功能使用它为您的应用程序生成唯一的签名,该签名基本上就是您的代码签名身份。

该证书也可以通过会员中心获得,但是它仅包含公共密钥,因此请确保该私有密钥的安全。

注意:钥匙串中还必须包含一个中间证书,以确保您的开发人员或发行证书是由另一个证书颁发机构颁发的。 第一次设置XCode时会自动安装它,因此基本上您不需要太在意它,因为它是手动配置的。

5.供应配置文件

作为安全措施,仅通过使用证书就无法在任何iOS设备上安装应用程序。 必须在应运行应用程序代码的每台设备上安装一个配置文件。 每个开发设置配置文件将包含一组iPhone开发证书,唯一设备标识符和一个应用程序ID。 应用程序ID是两部分的字符串,用于标识单个开发团队中的一个或多个应用程序。

简而言之,Provisioning配置文件说:“具有使用此证书的私钥签名的标识符的应用程序可以在这些设备上运行。”

由于配置文件与证书相关联,因此很明显,我们必须决定是否要创建证书

1.开发或发行档案。

2.开发配置文件限制为100个设备。

3.分发配置文件可以是Ad-Hoc或App Store分发配置文件。

6.标识符

也称为“应用程序标识符”或“捆绑包标识符”。 它们唯一地标识您的应用程序,并且通常具有反向域名,例如com.company.product

应用程序ID是两部分的字符串,用于标识单个开发团队中的一个或多个应用程序。 该字符串由Team ID和bundle ID搜索字符串组成,并用句点(。)分隔两个部分。 团队ID由Apple提供,对于特定的开发团队是唯一的,而

捆绑软件ID搜索字符串由开发人员提供,以匹配单个应用程序的捆绑软件ID或一组应用程序的捆绑软件ID。

捆绑包ID唯一定义每个App。 它在Xcode中指定。 一个Xcode项目可以有多个目标,因此可以输出多个应用程序。 常见的用例是同时具有精简版/免费版和专业版/完整版或以多种方式贴牌的应用程序。

B. iOS设备,开发机器和开发人员门户之间的基本流程:

请参阅以下流程图并仔细阅读以下详细信息:

1.在Mac中,已安装Xcode并将中间证书存储在钥匙串中。

2.通过钥匙串访问创建证书签名请求(CSR)。

3.私钥随CSR创建而生成,并存储在钥匙串中。 发布后,CSR可以上传到会员中心。 验证后,可以从会员中心发出证书。

4.证书已下载到计算机。 证书被推入钥匙串,并与私钥配对以形成代码签名身份。

5.供应配置文件是使用证书,应用程序ID和设备标识符创建的,并由Xcode下载

6. Xcode对App进行签名,并将Provisioning Profiles推送到设备上。

7. iOS会验证是否正确配置了所有内容,即,配给配置文件应包括用于签署应用程序的证书,设备UDID和正确的应用程序ID。

C.签名应用程序的分析

使用以下命令,您可以使用安全性命令行工具浏览一下系统上可用于签名代码的身份:

  $安全性查找身份-v -p代码签名 
01C8E9712E9632E6D84EC533827B4478938A3B15“ iPhone开发人员:Gaurav Tiwari(8TQNXO1G1K)”

任何已签名可执行文件的签名都嵌入在Mach-O二进制文件格式中,或者如果它是非Mach-O可执行文件(例如Shell脚本),则嵌入在扩展文件系统属性中。 这样,可以对OS X和iOS上的任何可执行二进制文件进行签名:动态库,命令行工具和.app捆绑包。 但这也意味着对程序进行签名的过程实际上会修改可执行文件,以将签名数据放入二进制文件中。

如果您有证书及其私钥,则使用codesign工具对二进制文件进行签名很简单。 让我们以上面列出的身份签名Example.app:

  $ codesign -ssecurity find-identity'iPhone Developer:Gaurav Tiwari(8TQNXO1G1K)'Example.app 

例如,如果您有要重新签名的应用程序包,这可能会很有用。 为此,您必须添加-f标志,并且codesign将用您选择的现有签名替换现有签名:

  $ codesign -f -s'iPhone Developer:Gaurav Tiwari(8TQNXO1G1K)'Example.app 

代码签名工具还为您提供有关可执行文件的代码签名状态的信息,如果出现问题,这些信息尤其有用。 例如,

  $ codesign -vv -d Example.app 

将告诉您有关Example.app的代码签名状态的一些信息:

 可执行文件= /用户/ toto /库/开发人员/ Xcode / DerivedData / Example-cfsbhbvmswdivqhekxfykvkpngkg / Build /产品/Debug-iphoneos/Example.app/Example 
 标识符= ch.kollba.example 
 格式=带有Mach-O薄(arm64)的捆绑包 
  CodeDirectory v = 20200 size = 26663 flags = 0x0(none)hash = 1324 + 5 location = embedded 
 签名大小= 4336 
  Authority = iPhone开发人员:Gaurav Tiwari(8TQNXO1G1K) 
  Authority =苹果全球开发者关系认证中心 
  Authority = Apple根CA 
 签名时间= 29.09.2014 22:29:07 
  Info.plist条目= 33 
  TeamIdentifier = DZM8538E3E 
 密封资源版本= 2个规则= 4个文件= 120 
 内部需求数= 1大小= 184 

现在,二进制文件已使用证书签名。 这样可以密封应用程序。 因此,让我们检查一下封条是否完整:

  $ codesign --verify Example.app 

就像任何好的UNIX工具一样,它通过不打印任何内容来告诉签名是可以的。 因此,让我们通过修改二进制文件来打破密封:

  $ echo'lol'>> Example.app/示例 
  $ codesign --verify Example.app 
  Example.app:主可执行文件无法通过严格验证 

因此,代码签名按预期方式工作。 带有已签名应用的混乱,封印被打破。

D.自动与自定义签名:

从XCode 8开始,Apple引入了该应用程序的自动签名。 在Project Navigator的常规选项卡中,如果我们选择“自动管理签名”并选择相应的团队,则XCode在内部管理“供应配置文件”和“签名证书”。 XCode可以根据需要修改配置文件。 (例如,如果添加了新功能,例如iCloud或Push通知,则XCode在内部将它们添加到新的Provisioning配置文件中并开始使用该配置文件)

而如果未选中“自动管理签名”选项,则必须手动选择“供应配置文件”。 因此称其为“定制签名”。 在这种情况下,XCode无法找到,添加或修改任何配置文件。

以下WWDC视频详细说明了该过程:

https://developer.apple.com/videos/play/wwdc2016/401/