1

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

1. 获取 signing identity 与证书

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

苹果根证书图片

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

Apple Worldwide Developer Relations Certification Authority 图片

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

首先,我们需要创建公钥和私钥,在 OSX 中我们可以通过钥匙串访问的证书助理创建一个CertificateSigningRequest.certSigningRequest文件,当这个文件穿件完毕后,钥匙串中的密钥项目中就会多出一对公钥和私钥。此时的公钥和私钥还是孤立的状态。

钥匙串的图片

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

enter image description here

接下来我们要做的就是把这个文件上传到苹果的 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 文件进行签名。

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

参考


Forelax
666 声望28 粉丝

不断探索更大的世界