引言
关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾。对于一个iOS开发小白、半吊子(比如像我自己)抑或老兵,或多或少会有或曾有过以下不详、疑问、疑惑甚至困惑:
什么是App ID?Explicit/Wildcard App ID有何区别?什么是App Group ID?
什么是证书(Certificate)?如何申请?有啥用?
什么是Key Pair(公钥/私钥)?有啥用?与证书有何关联?
什么是签名(Signature)?如何签名(CodeSign)?怎样校验(Verify)?
什么是(Team)Provisioning Profiles?有啥用?
Xcode如何配置才能使用iOS真机进行开发调试?
多台机器如何共享开发者账号或证书?
遇到证书配置问题怎么办?
Xcode 7免证书调试真机调试
本文将围绕相关概念做个系统的梳理串烧。 从 Xcode 7 开始支持普通 Apple 账号进行免证书真机调试,详情参考最新官方文档《Launching Your App on Devices》,或参考本文最后一节简介。
写在前面
1.假设你使用过Apple设备(iMac/iPad/iPhone)且 注册过Apple ID(Apple Account)。 2.假设你或你所在的开发组已加入苹果开发者计划(Enroll in iOS Developer Program to become a member),即已 注册开发者账号(Apple Developer Account)。
只有拥有开发者账号,才可以申请开发/发布证书及相关配置授权文件,进而在iOS真机上开发调试Apps或发布到App Store。
开发者账号分为Individual和Company/Organization两种类型。如无特别交代,下文基于$99/Year的普通个人开发者(Individual)账号展开。
3.若要真机调试实践,你必须至少拥有一台装有Mac OS X/Xcode的Mac开发机(iMac or MacBook),其上自带原生的Keychain Access。
一.App ID(bundle identifier)
App ID即Product ID,用于标识一个或者一组App。 App ID应该和Xcode中的Bundle Identifier是一致(Explicit)的或匹配(Wildcard)的。 App ID字符串通常以 反域名(reverse-domain-name)格式的Company Identifier(Company ID)作为前缀(Prefix/Seed),一般不超过255个ASCII字符。 App ID全名会被追加Application Identifier Prefix(一般为TeamID.),分为两类:
Explicit App ID:唯一的App ID,用于唯一标识一个应用程序。例如“com.apple.garageband”这个App ID,用于标识Bundle Identifier为“com.apple.garageband”的App。
Wildcard App ID:含有通配符的App ID,用于标识一组应用程序。例如“*”(实际上是Application Identifier Prefix)表示所有应用程序;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”开头(苹果公司)的所有应用程序。
用户可在Developer MemberCenter网站上注册(Register)或删除(Delete)已注册的App IDs。 App ID被配置到【XcodeTarget|Info|Bundle Identifier】下;对于Wildcard App ID,只要bundle identifier包含其作为Prefix/Seed即可。
二.设备(Device)
Device就是运行iOS系统用于开发调试App的设备。每台Apple设备使用 UDID来唯一标识。 iOS设备连接Mac后,可通过iTunes->Summary或者Xcode->Window->Devices获取iPhone的UDID(identifier)。 Apple Member Center网站个人账号下的 Devices中包含了注册过的所有可用于开发和测试的设备,普通个人开发账号每年累计最多只能注册 100个设备。
Apps signed by you or your team run only on designated development devices.
Apps run only on the test devices you specify.
用户可在网站上注册或启用/禁用(Enable/Disable)已注册的Device。 本文的Devices是指连接到Xcode被授权用于开发测试的iOS设备(iPhone/iPad)。
三.开发证书(Certificates)
1.证书的概念 证书是由公证处或认证机关开具的证明资格或权力的 证件,它是表明(或帮助断定)事理的一个 凭证。证件或凭证的尾部通常会烙印 公章。 每个中国人一生可能需要70多个证件,含15种身份证明。证件中“必需的”有30到40个。将这些证件按时间顺序铺开,那就是一个天朝子民的一生——持 准生证许可落地,以户籍证明入籍,以身份证认证身份,持结婚证以合法同居,最终以 死亡证明注销。 2.数字证书的概念 数字证书就是互联网通讯中 标志通讯各方 身份信息的一串数字,提供了一种在Internet上验证通信 实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构—— CA机构,又称为证书授权中心(Certificate Authority)发行的,人们可以在网上用它来识别对方的身份。
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
数字证书还有一个重要的特征就是时效性:只在特定的时间段内有效。
数字证书中的公开密钥(公钥)相当于公章。 某一认证领域内的根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。 为了防止GFW进行中间人攻击(MitM),例如篡改github证书,导致无法访问github网站等问题,可选择不信任CNNIC:
在[钥匙串-系统]中双击CNNIC ROOT,在【信任】|【使用此证书时】下拉选择【永不信任】。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在天朝子民的一生中,户籍证明可理解为等效的根证书:有了户籍证明,才能办理身份证;有了上流的身份证,才能办理下游居住证、结婚证、计划生育证、驾驶执照等认证。 3.iOS(开发)证书 iOS证书是用来证明iOS App内容(executable code)的合法性和完整性的数字证书。对于想安装到真机或发布到AppStore的应用程序(App),只有经过签名验证(Signature Validated)才能确保来源可信,并且保证App内容是完整、未经篡改的。 iOS证书分为两类:Development和Production(Distribution)。
Development证书用来开发和调试应用程序:A development certificate identifies you, as a team member, in a development provisioning profile that allows apps signed by you to launch on devices.
Production主要用来分发应用程序(根据证书种类有不同作用):A distribution certificate identifies your team or organization in a distribution provisioning profile and allows you to submit your app to the store. Only a team agent or an admin can create a distribution certificate.
普通个人开发账号最多可注册iOS Development/Distribution证书各2个,用户可在网站上删除(Revoke)已注册的Certificate。 下文主要针对iOS App开发调试过程中的开发证书(Certificate for Development)。 4.iOS(开发)证书的根证书 那么,iOS开发证书是谁颁发的呢?或者说我们是从哪个CA申请到用于Xcode开发调试App的证书呢? iOS以及Mac OS X系统(在安装Xcode时)将自动安装AppleWWDRCA.cer这个中间证书(Intermediate Certificates),它实际上就是iOS(开发)证书的证书,即根证书(Apple Root Certificate)。 AppleWWDRCA(Apple Root CA)类似注册管理户籍的公安机关户政管理机构,AppleWWDRCA.cer之于iOS(开发)证书则好比户籍证之于身份证。 如果Mac Keychain Access证书助理在申请证书时尚未安装过该证书,请先下载安装(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
5.申请证书(CSR:Certificate Signing Request) 可以在缺少证书时通过Xcode Fix Issue自动请求证书,这里通过Keychain证书助理从证书颁发机构请求证书:填写开发账号邮件和常用名称,勾选【存储到磁盘】。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
keychain将生成一个包含开发者身份信息的CSR(Certificate Signing Request)文件;同时,Keychain Access|Keys中将新增一对Public/Private Key Pair(This signing identity consists of a public-private key pair that Apple issues)。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
private key始终保存在Mac OS的Keychain Access中,用于签名(CodeSign)对外发布的App;public key一般随证书(随Provisioning Profile,随App)散布出去,对App签名进行校验认证。用户必须保护好本地Keychain中的private key,以防伪冒。
Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an entirely new identity to sign code.
Worse, if someone else has your private key, that person may be able to impersonate you.
在Apple开发网站上传该CSR文件来添加证书(Upload CSR file to generate your certificate):
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Apple证书颁发机构WWDRCA(Apple Worldwide Developer Relations Certification Authority)将使用private key对CSR中的public key和一些身份信息进行加密签名生成数字证书(ios_development.cer)并记录在案(Apple Member Center)。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
从Apple Member Center网站下载证书到Mac上双击即可安装(当然也可在Xcode中添加开发账号自动同步证书和[生成]配置文件)。证书安装成功后,在KeychainAccess|Keys中展开创建CSR时生成的Key Pair中的私钥前面的箭头,可以查看到包含其对应公钥的证书(Your requested certificate will be the public half of the key pair.);在Keychain Access|Certificates中展开安装的证书(ios_development.cer)前面的箭头,可以看到其对应的私钥。
编辑切换为居中
添加图片注释,不超过 140 字(可选)