在上一篇iOS 中的代码签名(一)—— 数字签名基本概念中,咱们简单解释了数字签名、证书的基本概念以及实际做用,在这一篇,咱们主要结合应用的上传过程来讲说代码签名的实际过程。html
首先在咱们的系统钥匙串的系统根证书列表中,是存在着苹果的 Root CA 签发的根证书的。ios
在咱们第一次打开 Xcode 的时候,Xcode 会在系统的钥匙串中添加苹果的『Apple Worldwide Developer Relations Certification Authority』,这个证书是被根证书信任的,这样咱们就创建了可信的证书信任链。vim
在苹果的官方文档中,将数字签名用到的公钥和私钥统称为 Signing Indetity,在 iOS 的打包发布过程当中,咱们首先须要作的就是去生成公钥私钥并从苹果那里得到证书。segmentfault
首先,咱们须要建立公钥和私钥,在 OSX 中咱们能够经过钥匙串访问的证书助理建立一个CertificateSigningRequest.certSigningRequest
文件,当这个文件穿件完毕后,钥匙串中的密钥项目中就会多出一对公钥和私钥。此时的公钥和私钥仍是孤立的状态。安全
而CertificateSigningRequest.certSigningRequest
文件的内容也很简单,就是咱们刚刚建立好的公钥内容。(使用 vim 打开查看,实际上的公钥和私钥通常都是这样子的一串很长的字符序列)bash
接下来咱们要作的就是把这个文件上传到苹果的 MemberCenter (简称 MC 哈),而后 MC 会利用咱们的公钥和我的信息生成对应的证书。咱们接下来点击下载并双击证书,在钥匙串里头就会把证书和对应的公钥私钥进行关联。app
这样,咱们就拥有了属于咱们本身的,独一无二的 signing identity。ide
当咱们成功建立证书之后,咱们通常还须要在苹果的 MC 上添加咱们 APP 的 bundle ID 和设备的 UUID,最后咱们须要在 MC 上针对证书、bundle ID 、bundle ID 对应的能力以及对应的设备进行配置,最终生成一个mobileprovision
文件,这个文件的细节咱们将会在下一篇进行讲解,如今咱们先记住这个文件中保存了咱们建立的证书列表就好。ui
当咱们完成开发后,会使用 Xcode 的 Archive(存档) 的功能进行打包,当咱们点击了 Archive 之后,Xcode 就会对咱们的代码进行编译和连接,最终产生一个后缀为.app
文件(严格意义上来讲这是一个文件夹,是 Mac 上的包文件,终端里头是把这个文件当作文件夹对待的)。而后 Xcode 会把对应的mobileprovision
文件拷贝到 APP 文件中(这个文件就是咱们在前面配置 provision profile 后下载下来的文件),这一步的详情能够在 Archive 的 log 中的『Process product packaging』这一步中看到;再以后,Xcode 会使用codesign
这个命令对 APP 文件进行签名。spa
若是咱们有多个 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 ,方便以后安装到设备上。
在 iOS 设备这一端,苹果的相关证书在出厂设置系统的时候就已经设置好了,因此能够认为其和苹果的通讯是安全的。iOS 设备在获得 ipa 以后,首先会把 ipa 进行解压,而后经过 APP 文件中的 mobileprovision 文件去下载其对应的证书,而后从证书中取得开发者的公钥,从而对 ipa 进行了数字签名的认证。