iOS的签名机制(二)

iOS的签名机制

  1. iOS签名机制的作用
    1. 保证安装到用户手机上的APP都是经过Apple官方允许的
  2. 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
    1. 生成CertificateSigningRequest.certSigningRequest文件
    2. 获得ios_development.cer\ios_distribution.cer证书文件
    3. 注册device、添加App ID
    4. 获得*.mobileprovision文件
  3. 对于真机调试,现在的Xcode已经自动帮开发者做了以上操作
  4. 思考
    1. 每一步的作用是什么?
    2. .certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处?

iOS签名机制 – 流程图

图1

  1. 3个角色
    1. MAC设备
      1. 这个MAC设备要生成这个MAC的一对公钥、私钥
      2. 即MAC要有他自己的公钥、私钥
    2. 苹果的后台服务器
      1. 苹果官方(后台)也生成自己的一对公钥、私钥
      2. 私钥保存在苹果自己的服务器
      3. 公钥在每一台苹果的iOS设备上
      4. 即每一台iOS设备都有一个相同的苹果后台的公钥
    3. iOS设备
      1. 保存这苹果后台的公钥
  2. 用户开发出APP
    1. 包中主要包含苹果的源代码Mach-o文件、图片、视频、nib、sb等
  3. 用户从开发出APP 到生成可上架的ipa流程(这里就把ipa包看做一个箱子,将要用来装下面的的东西)
    1. 我们开发的APP源码通过MAC本机的私钥签名,然后放入到ipa包中。生成物如下:
      1. APP源码包
      2. 签名(APP源码包的散列值通过MAC私钥加密后的值)
    2. 将MAC公钥生成证书:
      1. 将MAC的公钥也要放到ipa包中,否则无法验签
      2. 我们知道公钥的传递为了防止中间人攻击,采用证书来传递
      3. 证书的生成需要由CA来生成,其实就是通过CA的私钥来签名
      4. 这里苹果后台就是CA了
      5. 苹果后台CA给MAC公钥签名,获得证书,证书内容包含以下东西:
        1. MAC公钥
        2. 签名
    3. 生成mobileprobision文件
      1. 由第2步骤生成的证书,在加上devices、APP id、entitlements(APP的权限,比如推送等)等信息,通过苹果后台CA(即苹果后台私钥)再次加签,生成mobileprovision文件
      2. 将生成的文件放入到ipa包中
    4. 总结,上面所有的过程都是通过Xcode打包生成ipa来完成的
      1. 我们可以直接解压ipa包,就可以看见这些文件
  4. 上面这些东西的作用是什么呢?下面来看,ipa安装到手机上的操作
    1. 苹果手机上拥有苹果官方后台的公钥,通过这个公钥验证ipa包中的mobileprobision文件中的签名
      1. 说明当前的mobileprobision内容没有被串改
      2. 拿到证书,为了拿到MAC公钥
      3. 拿到devices,用于判断这台机器是否可以安装(哪些设备可以安装)
      4. 拿到APPid ,用于判断这个APP包是否是这个id(可以安装哪个APP)
      5. 拿到entitlements,用于判断这个APP包是否包含这些权限(内购、推送)
    2. 验证成功后,再次通过苹果官方的公钥来验证证书中的签名
    3. 验证成功,说明MAC的公钥是没有问题的,此时拿到MAC的公钥
    4. 通过MAC的公钥,来验证APP的签名
      1. 验证是否APP被串改
    5. 验证成功,说明代码没有被串改,安装APP
  5. 缕清思路
    1. APP加签,保证APP没有被串改
    2. MAC公钥加签生成证书,苹果充当CA(认证机构),保证你的MAC公钥是合法的,真正的
    3. 证书+APP信息加签,苹果保证你的APP是否可以正常安装。

流程步骤实操

  1. 生成Mac设备的公私钥 图1
    1. 这个过程生成CertificateSigningRequest.certSigningRequest文件
    2. 就是Mac设备的公钥
  2. 获得证书 图1
    1. 这个过程生成ios_development.cer、ios_distribution.cer文件
    2. 利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
  3. 生成mobileprovision 图1 图1
  4. 安全检测 图1
  5. AppStore
    1. 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
      1. 我们将ipa上传到App Store,苹果后台会对我们的APP进行重新签名
      2. 相当于我们从App Store重新下载的ipa,是苹果的私钥直接签名的,不包含MAC私钥签名那个流程了。
      3. 因此下载到手机上后,直接通过手机上的苹果官方公钥验签就可以了
    2. 它的验证流程会简单很多,大概如下所示 图1

􏰀􏰁􏰂􏰃文件总结

  1. .certSigningRequest􏰀􏰁文件
    1. Mac􏰄􏰅公钥
  2. .cer􏰀􏰁文件
    1. 􏰆􏰇利用Apple的私钥(􏰈􏰅􏰉CA),对􏰊􏰋􏰌Mac公钥生成了数字签名
  3. .mobileprovision􏰄􏰅􏰍􏰎􏰏􏰐􏰑􏰒􏰓
    1. 􏰆􏰇利用Apple私钥,对【􏰈􏰅􏰋􏰌􏰔.cer证书􏰕􏰖+devices+AppID+entitlements􏰗􏰘􏰙􏰐􏰑􏰒􏰓】进行数字签名。

知识点总结

  1. 加密解密算法
    1. 对称加密
      1. 加密解密用的是同一个秘钥
      2. 加密解密速度快
      3. 无法解决秘钥配送问题
    2. 公钥密码
      1. 加密解密用的是不同秘钥
      2. 公钥加密,私钥解密
      3. 私钥加密,公钥解密
      4. 加密解密速度慢
      5. 解决秘钥配送问题
  2. 单向散列函数
    1. 根据消息生成对应的固定长度的散列值
    2. 防止数据被篡改
  3. 数字签名
    1. 用私钥加密消息散列值,生成的密文
  4. 证书
    1. 用CA的私钥,对其他人的公钥生成数字签名
Table of Contents