最近需要给iOS开发团队做一次关于iOS开发证书以及代码签名的分享,于是花了点时间把这一块的知识重新学习和整理了一遍,从而有了这篇学习笔记。其中很多一些文字都是从网站或者博客上摘抄过来,为了阅读方便也做了一些调整,说白了我只是做了一些知识的梳理和整合。
该笔记涉及到内容有:开发者账号、签名证书、标识符(Identifiers)、设备(Devices)、APP授权机制、配置文件、ipa文件的签名和安全验证。
苹果为iOS开发者提供三种账号类型,如下:
什么是证书?证书就是:证明证书拥有者有证书上所说的能力,一个证书要涉及到颁发者、拥有者、证明拥有者有了什么能力。例如,CET-4证书;颁发者:学校,拥有者:自己,证明的能力:英语达到四级水平。苹果开发者证书也是一样,颁发者:自己,拥有者:安装证书的电脑;证明的能力:可以打包某应用程序。
向Member Center申请证书的过程,其实就是将在本地生成的certSigningRequest
文件提交给苹果,让它进行签名授权的过程。certSigningRequest
这个文件包含以下内容:
当苹果用私钥对其签名(授权)之后,我们便可以获得一个证书文件。拥有该证书后,我们便可以用对应的私钥对APP签名了。当iOS设备拿到APP时便可以通过证书中的公钥来验证APP的正确性,同时iOS设备本身可以验证证书的是否被授权,因为该证书是苹果自己签名的证书。
被苹果签名的证书会随APP一起打包到ipa文件中,并提交到App store中。
当我们获得签名证书之后,还需要一个证书来验证证书是否被正确授权,该证书就是Worldwide Developer Relations Certificate Authority证书。该证书一般都会随Xcode一起安装到我们的电脑中,也可以从Member Center去下载。所以如果没有该证书,开发者将不能使用对应的私钥对APP的签名,因为不能确保证书是否被授权。该证书也就是网上有提到媒介证书(Intermediate Certificate)。
苹果为开发者提供三种证书类型,用来在不同环境下使用,方便开发者的调试和测试。
使用企业(Enterprise)账号下的发布证书签名的APP可以安装到所以设备上,但是不能提交到App store。
在Member Center中,Identifiers可以管理App IDs、Pass Type IDs、Website Push IDs、iCloud Containers、App Groups、Merchant IDs、这里主要介绍App IDs。
App ID其实就是一个字符串,用来做APP唯一标识的字符串,App ID是大小写敏感的。一个APP有且只能有一个ID,并且唯一。在Project中称为Bundle ID(但是会有些小差别,Bundle ID不能包含[ * ]号)。在Member Center、Project、iTunes Connect都是需要此ID去标示此App的唯一性。App ID添加之后不能进行修改和删除。
如上图所示,App ID由Apple产生的一个Team ID作为前缀,后面跟的是开发者自定义的标识符,App ID字符串中只能包含字符(A-Z,a-z,0-9),连接符(-),点(.)而且此字符串最好是reverse-DNS格式的。例如你公司的域名是cctv.com,你App的名字是Hello,那么你可以用com.cctv.Hello作为你的Bundle ID。
App ID中也可以以[ .* ]来结尾,用来表示一个通配类型,如图:
每个APP还会对应一串数字的字符串(在itunesconnect创建之后可以得到),通过该字符串可以向Apple提供的http接口(http://itunes.apple.com/lookup#id=**),获取对应的APP在Appstore上的信息,可以用来检测版本更新,更新的log一些其他资料。
授权机制决定了哪些系统资源在什么情况下允许被一个应用使用。简单的说它就是一个沙盒的配置列表,上面列出了哪些行为被允许,哪些会被拒绝。Xcode 会将这个文件作为--entitlements
参数的内容传给 codesign。
在 Xcode 的 Capabilities 选项卡下选择一些选项之后,Xcode 就会生成这样一段 XML。 Xcode 会自动生成一个 .entitlements 文件,然后在需要的时候往里面添加条目。当构建整个应用时,这个文件也会提交给 codesign 作为应用所需要拥有哪些授权的参考。这些授权信息必须都在开发者中心的 App ID 中启用,并且包含在配置文件中。
授权列表在Member Center中的App ID中配置,这样便可以对应到具体的APP。
这里的Device指的就是用来测试或者调试用的设备。可以是iPhone、iPad、iPod、Apple watch以及Apple TV,在Member Center中添加测试Device的步骤其实很简单,只要拿到对应Deveice的UDID就可以添加了。我们可以利用iTunes、iTools、Xcode这些工具都可以拿到设备的UDID。
需要注意的就是,每个开发者账号,每年最多可以添加100台调试设备,而且添加之后不能更改和删除,想要修改就要等到下一年重新续费的时候才能进行修改或者删除调试设备了。
上述提到了证书可以证明APP的所属以及APP的完整性,保证APP的本身的安全。但是却不能细化到APP所使用的服务被苹果认可,比如APN推送服务,并且证书无法限制调试版APP的装机规模。于是苹果想出了mobileprovision
。一个mobileprovision
文件包含一下内容:
mobileprovision
文件中可以包含多个证书文件。mobileprovision
文件中包含设备列表,mobileprovision
发布类型的文件中则不包含设备列表。上述提到的苹果的签名是用的苹果自己的私钥对应的公钥是Worldwide Developer Relations Certificate Authority证书(媒介证书)中的公钥,所以该文件生成后,我们是不能进行修改的,必须从Member Center中配置并生成。
mobileprovision
文件中是否包含设备列表,可以分为带device信息的描述文件和不带device信息的描述文件如图:mobileprovision
文件结构如下:总的来说描述文件就是整合了证书、AppID、设备以及功能授权列表,从而确定了可由哪台电脑,把哪个App,安装到哪台手机上面。
这张图阐述了,开发iOS应用程序时,从申请证书,到打包的大致过程。
iOS程序最终都会以.ipa文件导出,ipa文件只是一个zip包,可以直接解压,先来了解一下ipa文件的结构:
解压后,得到上图的Payload目录,下面是个子目录,其中的内容如下:
当加入到苹果开发者计划之后,苹果通过证书来授权给开发者开发iOS应用,并提供了多种证书类型来满足不同的需求。为了保证APP的安全性和完整性,APP中所有的文件都将被签名。除非重新签名,否则不能对其做任何修改。
mobileprovision
文件是一个配置文件,由苹果签名后发布给开发者的。其中包含了证书、App ID、设备列表、授权列表。通过这些信息从而确定了可由哪台电脑,把哪个App,安装到哪台手机上面。所以证书和mobileprovision
文件是签名和打包的两个必要文件。