iOS Code Signing

最近回顾一下iOS的开发,有一些基本的问题都没有搞清楚,于是打算边学习边整理。Code Signing这个问题算是一个很基本的问题了,但是有时候却经常在处理这个问题上面花时间,毕竟这是真机调试必须经过的一关。

以下内容参考raywenderlich.com,也可以直接看中文翻译版:(译)iOS Code Signing: 解惑

Code Signing为何如此重要

为了让app能够顺利在手机上安装,code signing是必不可少的一步。如果只想在模拟器或者越狱过的手机上跑,那倒是可以完全忽略这个问题。除此之外,真机测试,发布企业版,发布App Store版本,都需要经过code signing。当然了,有时候在Xcode里面点击一下Fix Issue按钮,Xcode会自动帮你解决问题。在某些情况下,Xcode也会失灵,这种情况绝大多数是因为没有安装开发者私钥。

公钥和私钥

那么什么是密钥呢?当然就是别人不知道的东西了。用来给内容加密的东西都可以称作密钥。

在密码学领域,存在着两种加密方式,一种是对称加密,另一种是非对称加密。像我们熟悉的莫尔斯电码用的就是对称加密,只需要知道一种加密方式,就既能用来加密内容,也能用来解读被加密过的内容。

非对称加密就厉害多了,它的加密方式和解读方式是不一样的。存在两个密钥,一个叫公钥,大家都能看得到,一个叫私钥,只有少数几个人能看到。有时候,我们希望别人知道某些内容是自己发布的,于是就可以用自己的名字附到内容上,然后用私钥加密一下,看到内容的人就可以拿公钥解密,发现里面有你的名字,就知道这个内容是你发布的了。Code signing用的就是这个原理,确保每个app安装到手机上的时候的确是属于开发这个app的开发者。

Code Signing对象

乍一看,那似乎问题应该很简单,Apple只要给每个发布者注册一个私钥,然后大家都用统一的公钥,自然不就能区分出那个app是谁开发的了吗?当然,注重隐私的Apple公司肯定不会止步于此,还有更多的安全措施包含在里面。比如说每个开发者账号只能登记100个设备,于是设备信息也需要包括在内。或者是,app需要访问Push notification的功能,这时候安装证书又变了,同时app里面包含权限访问信息的字段也需要修改。总而言之,Apple是不会放心给程序员一个简单的开发环境的。

先把整体结构图放上来

Code Signing Objects

Private Key

这是最关键的一个信息,你可以在本地自己创建一个私钥,新创建的开发者证书都需要有一个私钥对应。如果没有,可以通过钥匙串Keychain Access提交一个申请获取。

Private key

每台电脑也会生成不一样的私钥,所以如果需要共同开发并且共用一个账号,那么就需要把私钥导出来,在每一台开发机上都安装。离开了私钥,证书无法给app签名。

Device

Apple拿什么区分不同的设备?就是用UDID。这是一个长度为40的16进制串,每个设备都不一样。这个UDID有什么作用呢?在发布Ad Hoc版本的app时候,设备会检查是否在code signing里面包含的设备列表里面,如果不是,就不能安装。

有时候我们在用新手机做开发的时候,也会弹出code signing不能用的情况。这种时候就是没有把新手机添加到设备列表里的缘故,可以让Xcode自动添加,也可以获取到UDID之后再到开发者中心里面手动输入UDID。需要注意100台设备的限制,超过的话就无法添加了,而且还不能逐个删除以前的设备,只能一次性全部设备清除,一年只能清楚一次。Apple在这方面真是太细心了。

Certificates

每台开发机都会有一个开发者证书,标示这个app是属于你开发的。这个证书全称是:#Apple Worldwide Developer Relations Certification Authority Certificate#

简单来讲,就是先从Keychain Access中生成一个Certificate Signing Request,然后在开发者中心将这个东西发给apple之后就可以在本地存储成一对公钥和私钥保存证书。

没有私钥的证书,安装在其他电脑上是没有用的,必须和私钥一起安装。

Application

就是一串DNS标识符,可以分成产品名称和公司标识符,合起来就是Bundle Identifier。可以在Info.plist里面修改。如下图:

info.plist

Provisioning Profile

把上面提到的东西合到一起,就是熟悉的Provisioning Profile了。

  1. App ID
  2. 可以运行的设备列表(UDID)
  3. 可以信赖的开发者(Certificate)

把这三个东西都放在一个文件里面,这就是Provisioning Profile。发布app的时候,会把profile一起拷贝获取,或者是一起打包成ipa文件。

所以,私钥和开发者证书都是在钥匙串访问Keychain Access里面管理的,而Provisioning Profile则是在Xcode里面管理。

正确的使用姿势

现在假设我们还没有现成的Provisioning Profile,我们一步一步来创建一个。

  1. 检查自己的公钥私钥对,方便起见,起个好名字。
  2. 用#钥匙串访问Keychain Access#创建一个certificate request,下载并且安装,记得检查一下是否安装成功。
  3. 下载#Apple Worldwide Developer Relations Certification Authority Certificate#并且安装。
  4. 检查自己的项目Bundle ID,然后在#Provisioning Portal#里面创建对应的App ID。
  5. 把所有需要测试的设备的UDID添加到#Provisioning Portal#里面,也可以不先这么做,之后让Xcode自己做,不过那样就得重新生成一次证书了。
  6. 接下来你就可以在#Provisioning Portal#里面创建自己的Provisioning Profile了。
  7. 下载,安装,你需要在Xcode里面检查一下是否成功安装了,在账户信息一览能看到所有和账户关联的Provisioning Profiles。

Done!记得备份自己的私钥,以便在不同的电脑上开发。

Comments !

links

social