最近需要和iOS开发团队分享iOS开发证书和代码签名,所以花了一些时间重新学习和整理了这一块的知识,得到了这篇学习笔记。这些文字很多都是从网站或者博客上摘录的,为了阅读方便
最近需要和iOS开发团队分享iOS开发证书和代码签名,所以花了一些时间重新学习和整理了这一块的知识,得到了这篇学习笔记。这些文字很多都是从网站或者博客上摘录的,为了阅读方便,做了一些调整。说白了,我只是梳理整合了一些知识。
本说明涉及以下内容:开发者账号、签名证书、标识符、设备、APP授权机制、配置文件、ipa文件的签名和安全验证。
开发者账户类型Apple iOS开发者有三种帐户类型,如下所示:
Apple Developer Program 年费 $99(或¥688) 可以在iOS App Store和Mac App Store上架应用可以以个人(Individual)或者组织(Organization)的名义加入,以组织身份加入需要提供邓白氏编码(DUNS Number),会多出Team Management功能,允许多人协作开发。在发布署名上以组织(Organization)的名义加入可以填写公司或组织信息(比如某某公司、某某工作室),而以个人(Individual)加入只能默认显示注册时填写的个人信息,并且不能修改。Apple Developer Enterprise Program年费 $299,用于以InHouse方式发布企业内部应用,不能上架App Store企业证书过期则已经安装的应用无法继续运行。iOS Developer University Program
高校计划需要提供高校基本信息,免费提供。苹果为鼓励高校更多的参与到苹果开发者计划中来,特意推出这一项计划,高校计划具有在真机上测试等权限,但不能将App发布到App Store。
证书(证书)什么是证书?一个证书是:证明证书的拥有者具有证书中提到的能力。一个证书涉及到颁发者,拥有者,拥有者有什么能力。比如四级证书;签发人:学校,所有人:本人,能力证明:英语达到四级。苹果开发者证书也是如此,颁发者:本人,拥有者:安装证书的电脑;被证明的能力:你可以打包一个应用程序。
开发者证书能力来源会员中心申请证书的过程,其实就是将本地生成的certSigningRequest文件提交给苹果进行签名授权的过程。CertSigningRequest该文件包含以下内容:
申请者信息,此信息是用申请者的私钥加密的。申请者公钥,此信息是申请者使用的私钥对应的公钥。摘要算法和公钥加密算法。
当苹果用私钥对其进行签名(授权)时,我们就可以得到一个证书文件。有了这个证书,我们就可以用相应的私钥对APP进行签名了。当iOS设备获取APP时,可以通过证书中的公钥验证APP的正确性。同时iOS设备本身可以验证证书是否授权,因为证书是苹果自己签名的。
苹果签署的证书会和APP一起打包成ipa文件,提交给App store。
在我们获得签名证书之后,我们还需要一个证书来验证该证书是否被正确授权,这就是全球开发者关系认证机构证书。一般来说,这个证书会用Xcode安装在我们的电脑里,或者从会员中心下载。所以,没有这个证书,开发者就无法用相应的私钥对APP进行签名,因为无法确定证书是否被授权。这个证书就是互联网上提到中级证书。
证书类型苹果提供了三类证书供开发者在不同环境下使用,方便开发者调试和测试。
开发证书:平时用来进行真机调试的证书,用该证书签名的APP,只能安装在指定的设备上。测试证书:不可以用来真机调试的证书,但是可以编译到指定的真机上(不可以进行调试)。主要用来提交给测试进行功能的验证,和开发证书的区别在于,它和发布证书类似处于非沙盒坏境。但是用该证书签名的APP无法提交到App store,只能安装在指定设备上。 发布证书:不可以用来调试和测试,也不能安装在指定设备上,只能提交到App store。
企业账号下发布证书签名的APP可以安装在所有设备上,但是不能提交到App store。
标识符(标识符)在会员中心,标识符可以管理App id,通行证类型id,网站推送id,iCloud容器,App群,商家id,这里主要介绍App id。
应用ID实际上是一个字符串,用作应用的唯一标识符。应用程序ID区分大小写。一个APP有且只能有一个ID,并且是唯一的。在Project中称为Bundle ID(但是会有一些细微的区别,Bundle ID不能包含[*]符号)。在会员中心、项目和iTunes Connect中,需要此ID来标记此应用的唯一性。添加后,不能修改或删除应用ID。
app角色的构成和类型如上图所示,App ID的前缀是Apple生成的团队ID,后面是开发者定义的标识符。应用ID字符串只能包含字符(a-z、A-Z、0-9)、连字符(-)和点(。),而且这个字符串最好是反向DNS格式的。比如你公司的域名是cctv.com,你的App的名字是Hello,那么你可以用com.cctv.Hello作为你的捆绑ID。
ID也可以以[。*]表示泛型类型,如图所示:
类型的确切应用程序ID:不带[。*]以标识符结尾的可以称为精确类型,这种类型的App ID可以作为App的捆绑ID。通配符应用ID:以[]结尾的应用ID。*]在标识符中是一个通配符App ID,不能作为App的捆绑ID,后面会讨论它的作用。每个APP还会对应一串数字(itunesconnect创建后可用),可以用来提供苹果(http://itunes.apple.com/lookup?Id=**),获取Appstore上对应APP的信息,可以用来检测版本更新,以及更新日志的一些其他信息。
app的功能在Xcode工程中,Bundle ID储存在Info.plist中,当你编译工程的时候,他会把此文件拷贝到你的app包中。 在iTunes Connect,用Bundle ID去标识App,在你第一次构建上传之后,你就不能在改变或者删除你的Bundle ID了。 在Member Center,你创建一个和Bundle ID相匹配的App ID。如果App ID是精准类型的,你就必须精确的去匹配你的Bundle ID。
权利(权利)授权机制决定了在什么情况下允许应用程序使用哪些系统资源。简单来说就是一个沙盒配置列表,里面列出了哪些行为是允许的,哪些是拒绝的。Xcode会将这个文件作为- entitlements参数的内容传递给codesign。
在Xcode的“功能”标签下选择一些选项后,Xcode将生成这样一段XML。Xcode会自动生成一个。权限文件,然后在需要时向其中添加条目。当整个应用程序构建完成后,该文件也将提交给codesign,作为应用程序需要哪些许可证的参考。所有这些授权信息必须在开发者中心的App ID中启用,并包含在配置文件中。
授权列表在会员中心的App ID中配置,可以对应到具体的App。
设备(装置)这里的设备是指用于测试或调试的设备。可以是iPhone,iPad,iPod,Apple watch,Apple TV。在Member Center中添加测试设备的步骤实际上非常简单。只需获取相应设备的UDID,即可添加。我们可以使用iTunes、iTools和Xcode来获取设备的UDID。
需要注意的是,每个开发者账号每年最多可以添加100个调试设备,添加后不能更改或删除。如果你想改变他们,你必须等到下一年续费,然后才能修改或删除调试设备。
预置描述文件(预置描述文件)上面提到的证书可以证明APP的所有权和完整性,保证APP本身的安全性。但不能细化到APP使用的服务都是苹果认可的,比如APN推送服务,证书也不能限制APP调试版的安装规模。所以苹果想出了mobileprovision。mobileprovision文件包含以下内容:
AppID 这里的AppId可以是精准类型的也可以是通配符类型。证书列表 在多人协议开发时,一个mobileprovision文件中可以包含多个证书文件。功能授权列表可安装的设备列表 测试和调试mobileprovision文件中包含设备列表,mobileprovision发布类型的文件中则不包含设备列表。苹果的签名
苹果的上述签名使用的是苹果自己的私钥,对应的公钥是全球开发者关系认证机构证书(media certificate)中的公钥。因此,文件生成后,我们不能对其进行修改,必须从成员中心进行配置和生成。
配置文件的差异从mobileprovision文件中是否包含设备列表,可以分为带device信息的描述文件和不带device信息的描述文件如图:
也可以根据配置文件中包含的证书文件的类型来区分:开发类型、测试类型、发布类型。 也可以根据配置文件中包含的App ID来做区分,如果文件中App ID是精准类型的,那么该配置只能用来对指定的APP进行使用。如果是通配类型的,那么该证书可以用来对匹配的Bundle ID的APP进行使用。如果是Company类型的开发者账号,可以生成一个供团队使用的Team Provisioning Profile,通过这个配置文件,团队内成员可以共用一个配置文件来进行开发调试,当然,App ID得指定成通配类型的。mobileprovision文件结构如下:
总的来说描述文件就是整合了证书、AppID、设备以及功能授权列表,从而确定了可由哪台电脑,把哪个App,安装到哪台手机上面。一般来说,描述文件综合了证书、AppID、设备、功能授权列表来决定可以安装在哪台电脑、哪款App、哪部手机上。
APP的签名和安全验证流程ipa文件的签署流程这个图说明了开发iOS应用时,从申请证书到打包的一般流程。
投资促进机构文件的组成
IOS程序最终会导出为。ipa文件。ipa文件只是一个zip包,可以直接解压。我们先来了解一下ipa文件的结构:
解压后可以得到上图所示的有效载荷目录,下面是一个子目录,内容如下:
资源文件,例如图片、html、等等。_CodeSignature/CodeResources。这是一个plist文件,可用文本查看,其中的内容就是是程序包中(不包括Frameworks)所有文件的签名。注意这里是所有文件。意味着你的程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名。可执行文件。此文件跟资源文件一样需要签名。一个mobileprovision文件.打包的时候使用的,从MC上生成的。Frameworks。程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,其中的结构应该和app差不多,也包含签名信息CodeResources文件。
ipa文件的安全验证过程解压ipa文件取出embedded.mobileprovision,通过签名校验是否被篡改过 a. 其中有几个证书的公钥,其中开发证书和发布证书用于校验签名 b. BundleId c. 授权列表校验所有文件的签名,包括Frameworks比对Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的
涉及的其他问题摘要加入苹果开发者计划后,苹果通过证书授权开发者开发iOS应用,并提供多种证书类型以满足不同需求。为了保证应用的安全性和完整性,应用中的所有文件都将被签名。除非重新签名,否则不能对其进行任何更改。
Mobileprovision文件是一个配置文件,由Apple签名并发布给开发者。包含证书、App ID、设备列表、授权列表。通过这些信息,我们可以确定哪台电脑、哪款App、哪部手机可以安装。因此,证书和mobileprovision文件是签名和打包的两个必要文件。