在上一篇iOS 中的代码签名(一)—— 数字签名基本概念中,我们简单解释了数字签名、证书的基本概念以及实际作用,在这一篇,我们主要结合应用的上传过程来说说代码签名的实际过程。
1. 获取 signing identity 与证书
首先在我们的系统钥匙串的系统根证书列表中,是存在着苹果的 Root CA 签发的根证书的。
在我们第一次打开 Xcode 的时候,Xcode 会在系统的钥匙串中添加苹果的『Apple Worldwide Developer Relations Certification Authority』,这个证书是被根证书信任的,这样我们就建立了可信的证书信任链。
在苹果的官方文档中,将数字签名用到的公钥和私钥统称为 Signing Indetity,在 iOS 的打包发布过程中,我们首先需要做的就是去生成公钥私钥并从苹果那里获得证书。
首先,我们需要创建公钥和私钥,在 OSX 中我们可以通过钥匙串访问的证书助理创建一个CertificateSigningRequest.certSigningRequest
文件,当这个文件穿件完毕后,钥匙串中的密钥项目中就会多出一对公钥和私钥。此时的公钥和私钥还是孤立的状态。
而CertificateSigningRequest.certSigningRequest
文件的内容也很简单,就是我们刚刚创建好的公钥内容。(使用 vim 打开查看,实际上的公钥和私钥一般都是这样子的一串很长的字符序列)
接下来我们要做的就是把这个文件上传到苹果的 MemberCenter (简称 MC 哈),然后 MC 会利用我们的公钥和个人信息生成对应的证书。我们接下来点击下载并双击证书,在钥匙串里头就会把证书和对应的公钥私钥进行关联。
这样,我们就拥有了属于我们自己的,独一无二的 signing identity。
2. 创建 Provisioning Profile
当我们成功创建证书以后,我们一般还需要在苹果的 MC 上添加我们 APP 的 bundle ID 和设备的 UUID,最后我们需要在 MC 上针对证书、bundle ID 、bundle ID 对应的能力以及对应的设备进行配置,最终生成一个mobileprovision
文件,这个文件的细节我们将会在下一篇进行讲解,现在我们先记住这个文件中保存了我们创建的证书列表就好。
3. 对代码的产物进行签名
当我们完成开发后,会使用 Xcode 的 Archive(存档) 的功能进行打包,当我们点击了 Archive 以后,Xcode 就会对我们的代码进行编译和链接,最终产生一个后缀为.app
文件(严格意义上来说这是一个文件夹,是 Mac 上的包文件,终端里头是把这个文件当做文件夹对待的)。然后 Xcode 会把对应的mobileprovision
文件拷贝到 APP 文件中(这个文件就是我们在前面配置 provision profile 后下载下来的文件),这一步的详情可以在 Archive 的 log 中的『Process product packaging』这一步中看到;再之后,Xcode 会使用codesign
这个命令对 APP 文件进行签名。
如果我们有多个 Signing Identity,我们也可以在工程『Build Settings』选项中进行配置
那具体codesign
命令是如何进行签名的呢?一个没有被签名的 APP 文件的结构类似这样:
TestOC.app
├── Base.lproj
│ ├── LaunchScreen.storyboardc
│ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│ │ ├── Info.plist
│ │ └── UIViewController-01J-lp-oVM.nib
│ └── Main.storyboardc
│ ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib
│ ├── Info.plist
│ └── UIViewController-BYZ-38-t0r.nib
├── Info.plist
├── PkgInfo
├── TestOC(二进制文件)
└── embedded.mobileprovision
codesign
在对 APP 文件进行签名的时候,会把对应的签名直接添加到二进制文件的内部,而针对资源文件则是利用一个叫做 『CodeResources』的 plist 文件把对应的资源文件和数字签名进行记录。签名结束后的 APP 文件的内容如下:
TestOC.app
├── Base.lproj
│ ├── LaunchScreen.storyboardc
│ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│ │ ├── Info.plist
│ │ └── UIViewController-01J-lp-oVM.nib
│ └── Main.storyboardc
│ ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib
│ ├── Info.plist
│ └── UIViewController-BYZ-38-t0r.nib
├── Info.plist
├── PkgInfo
├── TestOC
├── _CodeSignature
│ └── CodeResources
└── embedded.mobileprovision
最后,我们可以使用 Xcode 打包生成对应的 ipa ,方便之后安装到设备上。
4. iOS 设备进行验证
在 iOS 设备这一端,苹果的相关证书在出厂设置系统的时候就已经设置好了,所以可以认为其和苹果的通信是安全的。iOS 设备在得到 ipa 之后,首先会把 ipa 进行解压,然后通过 APP 文件中的 mobileprovision 文件去下载其对应的证书,然后从证书中取得开发者的公钥,从而对 ipa 进行了数字签名的认证。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。