为什么有些APP没有上架App Store?iOS 打包签名内幕( 二 )

  • .cer 文件:Apple后台使用Apple私钥对Mac公钥进行签名后生成的证书 。
  • .p12 文件:Mac本地生成的钥匙对私钥 。由于私钥是本地私有的,但你可以使用.p12将私钥导出给其他团队成员使用 。
  • Identifiers 。Identifiers是iOS设备安装应用时用来识别不同App的唯一标识,点击创建App IDs,同时勾选app所包含的权限:APNs、HealthKit、iCloud等 。
  • entitlements 。App使用到的各种权限(APNs、HealthKit、iCloud等),也是需要Apple验证通过后才能生效的,Apple将这些权限开关统一称为Entitlements 。当第一次在Xcode中勾选权限时,项目中会自动生成一个.entitlements后缀的文件,里面记录了App所拥有的权限 。
  • Profiles 。.cer文件只是声明了证书的类型,比如Apple Development、Apple Distribution、APNs推送等等,而至于使用什么证书打包、AppID是什么、打包的App包含了哪些功能、可以在哪些设备上安装,则是通过Provisioning Profile 描述文件(.mobileprovision后缀)来说明的,苹果后台将所有这些信息组合后再使用Apple私钥进行签名,最后生成Provisioning Profile描述文件:
  • 2.2 AppStore签名发布App至AppStore之前需要经过苹果后台审核,审核通过苹果后台会用Apple私钥对App数据进行加密签名生成ipa包;用户从AppStore下载App后,使用设备内置的Apple公钥解密验证,验证通过安装成功 。由于AppStore分发的过程中上传审核、下载安装的整个过程都处在苹果的生态链内,所以只需要一次验证就能保证安全性 。
    为什么有些APP没有上架App Store?iOS 打包签名内幕

    文章插图
     
    2.3 其他签名从AppStore下载安装App只需要一次数字签名就足以保证安全性,但除了这种途径苹果还有其他的安装方式:
    • 开发中连接设备到Xcode进行调试安装
    • AD-Hoc内部测试安装,需要先获取设备UDID并注册,并且有最多100台设备的限制
    • In-House企业内部分发,安装设备数量无限制,但安装后需主动在设置中选择信任证书
    那这些安装App的过程中苹果又是怎样保证流程安全性的呢?答案就是双重签名机制,苹果使用前面讲到的Mac本地钥匙对以及Apple后台钥匙对进行多次数字签名,从而保证整体流程的可控 。
    1. Mac 钥匙串访问 在本地生成一对公私钥钥匙对,下面默认为公钥L、私钥L(L:Local) 。
    2. Apple已有一对公私钥钥匙对,私钥A在Apple后台,公钥A内置到每一台iOS设备终端(A:Apple) 。
    3. 上传公钥L至Apple后台,使用私钥L对公钥L进行数字签名生成签名证书.cer,同时使用私钥L对额外信息(使用什么证书打包、AppID、打包的App包含了哪些功能、可以在哪些设备上安装)进行签名生成描述文件Provisioning Profile,之后将.cer和Provisioning Profile下载安装到Mac机器上 。
    4. 编译打包app,选择签名证书.cer,打包指令会自动找到该证书对应的私钥L(能匹配是因为钥匙对是成对出现的,前提是本地必须已经存在L私钥,也就是p12的安装),然后使用私钥L对app进行签名 。这些签名数据包含两部分:Mach-O可执行文件会把签名直接写入这个文件中,其他资源文件则会保存在_CodeSignature目录下 。你可以将打包生成的.ipa文件另存为.zip,解压后对Payload文件夹中的.app文件右键、显示包内容,就可以看到签名数据 。另外签名过程中对于App内包含的动态库以及插件(Plugins、Watch、Frameworks文件夹),每一个都会单独进行一次签名,并生成各自的Mach-O可执行文件和_CodeSignature 。签名数据指代码内容、App包含的所有资源文件,只要其中有任何改动,都必须重新签名才有效 。
    5. 打包的过程中会将描述文件Provisioning Profile命名为embedded.mobileprovision放入到打包app中 。
    6. 安装/启动,iOS设备使用内置的公钥A验证embedded.mobileprovision是否有效(设备是否在允许安装列表内),同时再次验证里面包含的.cer证书签名是否有效(证书过期与否)并取出公钥L 。
    7. embedded.mobileprovision验证通过,就使用公钥L解密验证app签名信息:AppID是否对应、权限开关是否跟app里的entitlements一致等等 。
    8. 所有验证通过,安装/启动完成 。

    为什么有些APP没有上架App Store?iOS 打包签名内幕

    文章插图
    【为什么有些APP没有上架App Store?iOS 打包签名内幕】 
    以上流程便是开发调试、AD-Hoc、In-House等方式打包安装App的过程,区别只在于第⑤步中设备IDs的匹配规则不一致 。开发调试只安装当前联调的设备;AD-Hoc允许安装到已在开发者账号下注册过的设备,且每年最多允许100台;In-House无设备数量限制,常用于企业内部App的分发 。


    推荐阅读