资讯专栏INFORMATION COLUMN

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

GraphQuery / 3460人阅读

摘要:在上一篇中的代码签名一数字签名基本概念中,我们简单解释了数字签名证书的基本概念以及实际作用,在这一篇,我们主要结合应用的上传过程来说说代码签名的实际过程。参考,从这里可以获取一些安全知识的大概了解,这里详细解释了数字签名认证的过程

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

参考

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/11202.html

相关文章

  • 匠心打造canvas签名组件

    摘要:原文匠心打造签名组件导读月又是项目吃紧的时候,一大波需求袭来,猝不及防。可以先戳这里体验把后面将要提到的签名组件。剩下的也是绑定事件中关键的一步。设置完成了上述功能,一个签名插件就已经成型了。 本文首发于CSDN网站,下面的版本又经过进一步的修订。原文:匠心打造canvas签名组件 导读 6月又是项目吃紧的时候,一大波需求袭来,猝不及防。 度过了漫长而煎熬的6月,是时候总结一波。最近移...

    MAX_zuo 评论0 收藏0
  • iOS 代码签名(一)—— 数字签名基本概念

    摘要:在继续深入了解之前,首先要了解一些关于数字签名的基本概念,关于这些基本概念,阮一峰的这篇博客已经做了非常好的解释,可以先移步一看。 在继续深入了解之前,首先要了解一些关于数字签名的基本概念,关于这些基本概念,阮一峰的这篇博客已经做了非常好的解释,可以先移步一看。 如果用 A 来表示文章中的鲍勃,B 来表示苏珊,Z 来表示道格,那么文章最后的所描述的情况可以用下图来表示: showImg...

    Lavender 评论0 收藏0
  • IOS微信上Vue单页面应用JSSDK签名失败解决方案

    摘要:路由守卫内触发更新签名获取真实有效微信签名此处需要自行处理在路由守卫内更新签名,保证是使用当前页面,是使用目标路由完整地址再加上域名使用签名调用在使用的页面通过取出缓存的微信签名,然后进行签名。 背景 手机型号: 型号:iphone 7 / iphone xs max版本:ios 10.3.1 / ios 12.1微信版本:WeChat 6.7.3 问题还原: Vue应用(vue-ro...

    lixiang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<