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

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了iOS 中的代码签名(二)—— 代码签名的实际过程脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

1. 获取 signing identITy 与证书

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

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

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

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

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

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

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

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

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

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

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

这样,我们就拥有了属于我们自己的,独一无二的 signing identity。

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

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 文件进行签名。

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

如果我们有多个 Signing Identity,我们也可以在工程『Build Settings』选项中进行配置

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

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

参考

脚本宝典总结

以上是脚本宝典为你收集整理的iOS 中的代码签名(二)—— 代码签名的实际过程全部内容,希望文章能够帮你解决iOS 中的代码签名(二)—— 代码签名的实际过程所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。