iOS签名机制

写于前

写一个系列
本文概要
  • 了解iOS签名机制
  • 对机制的每个环节有大致的了解
  • 阅读这篇文章前,需要对加密、Hash、数字签名、数字证书有一定的了解

About Code Signing

此部分大多来自苹果官网的描述

Code signing is a macOS security technology that you use to certify that an app was created by you. Once an app is signed, the system can detect any change to the app—whether the change is introduced accidentally or by malicious code.
You participate in code signing as a developer when you obtain a signing identity and apply your signature to apps that you ship. A certificate authority (often Apple) vouches for your signing identity.
(代码签名是一种安全机制去保证当前App是由你创建的。一旦签名,系统可以检测app是否被更改or恶意入侵。开发者也会参与其中,CA(Apple)担保签名身份。-这里说的应该是CA颁发证书保证公钥合法性)

Benefits of Code Signing

Ensure that a piece of code has not been altered since it was signed.

  • 确保代码自签名后未被更改

Identify code as coming from a specific source (a developer or signer).

  • 标记代码的特定来源。签名包含指向特定作者的信息

Determine whether code is trustworthy for a specific purpose.

  • 确定代码在某些特定目的时值得信任。例如,可以利用代码签名来声明App升级时与之前的App是同一App

iOS签名机制

从automatic signing入手
  • 在日常开发中,我们都会在工程中选择“Automatically manage signing”,让Xcode来完成一系列的签名工作

    • 自动签名,Xcode所做的工作
      • 生成数字证书
      • 注册真机设备
      • 管理App IDs
      • 管理Provisioning Profile
      • 编辑权限及info文件(entitlements.plist里面包含一系列的App权限:推送/后台/icloud等)
  • Manual signing:需要去开发者网站操作certificate以及Provisioning Profile。一般在打包机打包/企业分发等场景会用到

开发App到安装的流程
  • 先看下整个流程,再来看每个环节的作用,以及Provisioning Profile

  • 流程图基于bang神的文章,稍加补充说明

  • 1、 Mac开发设备:生成一对密钥对。私钥本地保存

    • 对应:钥匙串访问-证书助理-从证书颁发机构请求证书。获得.certificateSigningRequest文件,Mac公钥
  • 2、 Apple存在Apple的密钥对,私钥Apple后台保存,公钥iOS设备有一份

    • 对应:苹果的流程
  • 3、 ①签名:生成证书

    • 对应:开发者网站上,新增时,会上你上传第一步生成的CRS文件。生成证书,下载
  • 4、 ②签名:生成Provisioning Profile(包括什么下文单独讲)。

    • 对应:开发者网站上,配置AppID/设备/权限/证书等,最后下载Provisioning Profile文件
  • 5、 ③签名:编译App后,Mac私钥对App进行签名,同时打包,安装包包含Provisioning Profile,在iPA中的文件名是embedded.mobileprovision

    • Xcode流程。会根据证书存着公钥,在本地找到对应的Mac私钥,去签名App。签名分为两部分,Mach-O可执行文件的签名直接包含在其中(上图右半部分是Mach-O View查看可执行文件的内容,包含code signature),其他资源文件的签名保存在_CodeSignature下。

    这一点代码签名的种类,苹果的官方文档也有说明(直接简译了下):

    1. 通用二进制文件签名保存在齐本身
    2. App安装包中的各种数据组件,比如info.plist。其签名在_CodeSignature/CodeResources中
    3. 本身已签名的嵌套代码(libraries,helper tools等)。其签名在_CodeSignature/CodeResources中(这里可以看出,在逆向中,注入动态库需要对其进行签名后,才能对安装包整体进行重签名)
  • 6、 ④-⑤-⑥验签均是iOS设备的流程,每一步的作用,在上面的流程图中均已标明。当然这只是一部分流程,还会作Devices、APPID、权限控制等验证工作

  • 补充:其实上面的前几步流程,在发布App/企业分发等,是需要人工操作的。但是真机调试时,只用在Xcode配置账号,Xcode会自动完成流程。

从AppStore下载App
  • 其实我们看到上面复杂的签名流程,只是为了安全,确保安装包来源可靠。从④⑤⑥的验签流程就能发现,一步步都是为了保证合法性。
  • 如果直接是从AppStore下载的App,你查看iPA包里面,其实是没有embedded.mobileprovision文件的,因为你已经是从Apple认可的渠道下载的,不需要完整的流程,Apple已经确保是合法的
Provisioning Profile
  • 包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。
  • 如下,通过预览一个mobileProvisioning文件,查看里面包含什么东西

  • 包含Provisioned Devices,AppId,Entitlements,这些在安装到手机时都会进行验证。
  • 包含certificates里包含Mac公钥及签名,会决定Xcode采用其对应的私钥对应用程序进行签名
  • 分两类:development/distribution(用于提交审核用)
概念补充
  • p12:之前配置打包机的时候,遇到这个概念,指的是Mac私钥,可以从keychain中导出。可以共享给同事的Mac或配置打包机
  • CertificateSigningRequest文件:CRS文件,前面已经提到,Mac公钥

参考文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值