iOS 中的代码签名(二)—— 代码签名的实际过程

在上一篇iOS 中的代码签名(一)—— 数字签名基本概念中,咱们简单解释了数字签名、证书的基本概念以及实际做用,在这一篇,咱们主要结合应用的上传过程来讲说代码签名的实际过程。html

1. 获取 signing identity 与证书

首先在咱们的系统钥匙串的系统根证书列表中,是存在着苹果的 Root CA 签发的根证书的。ios

苹果根证书图片

在咱们第一次打开 Xcode 的时候,Xcode 会在系统的钥匙串中添加苹果的『Apple Worldwide Developer Relations Certification Authority』,这个证书是被根证书信任的,这样咱们就创建了可信的证书信任链。vim

Apple Worldwide Developer Relations Certification Authority 图片

在苹果的官方文档中,将数字签名用到的公钥和私钥统称为 Signing Indetity,在 iOS 的打包发布过程当中,咱们首先须要作的就是去生成公钥私钥并从苹果那里得到证书。segmentfault

首先,咱们须要建立公钥和私钥,在 OSX 中咱们能够经过钥匙串访问的证书助理建立一个CertificateSigningRequest.certSigningRequest文件,当这个文件穿件完毕后,钥匙串中的密钥项目中就会多出一对公钥和私钥。此时的公钥和私钥仍是孤立的状态。安全

钥匙串的图片

CertificateSigningRequest.certSigningRequest文件的内容也很简单,就是咱们刚刚建立好的公钥内容。(使用 vim 打开查看,实际上的公钥和私钥通常都是这样子的一串很长的字符序列)bash

enter image description here

接下来咱们要作的就是把这个文件上传到苹果的 MemberCenter (简称 MC 哈),而后 MC 会利用咱们的公钥和我的信息生成对应的证书。咱们接下来点击下载并双击证书,在钥匙串里头就会把证书和对应的公钥私钥进行关联。app

公钥私钥关联的图片

这样,咱们就拥有了属于咱们本身的,独一无二的 signing identity。ide

流程图片

2. 建立 Provisioning Profile

当咱们成功建立证书之后,咱们通常还须要在苹果的 MC 上添加咱们 APP 的 bundle ID 和设备的 UUID,最后咱们须要在 MC 上针对证书、bundle ID 、bundle ID 对应的能力以及对应的设备进行配置,最终生成一个mobileprovision文件,这个文件的细节咱们将会在下一篇进行讲解,如今咱们先记住这个文件中保存了咱们建立的证书列表就好。ui

3. 对代码的产物进行签名

当咱们完成开发后,会使用 Xcode 的 Archive(存档) 的功能进行打包,当咱们点击了 Archive 之后,Xcode 就会对咱们的代码进行编译和连接,最终产生一个后缀为.app文件(严格意义上来讲这是一个文件夹,是 Mac 上的包文件,终端里头是把这个文件当作文件夹对待的)。而后 Xcode 会把对应的mobileprovision文件拷贝到 APP 文件中(这个文件就是咱们在前面配置 provision profile 后下载下来的文件),这一步的详情能够在 Archive 的 log 中的『Process product packaging』这一步中看到;再以后,Xcode 会使用codesign这个命令对 APP 文件进行签名。spa

Archive 的 log 图片

若是咱们有多个 Signing Identity,咱们也能够在工程『Build Settings』选项中进行配置

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 进行了数字签名的认证。

参考

相关文章
相关标签/搜索