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

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

参考

  1. About Software Security,从这里可以获取一些安全知识的大概了解

  2. Cryptography Concepts In Depth,这里详细解释了数字签名认证的过程

关键字:ios, 安全, 文件, 签名


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部