阅读 52

签名相关

代码签名

代码签名 就是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的目的。

appStore安装的时候有苹果私钥对应用进行签名, 手机苹果系统有公钥对应用签名进行验证.

双向签名验证

Debug模式的验证

  • Xcode通过钥匙串生成一对公钥M私钥M在Mac电脑里面

  • 苹果服务器有一对私钥A, 公钥A(在手机)

  • Mac电脑公钥M加上一些组织机构信息等信息, 生成一个CSR文件, 传递给苹果服务器

  • 苹果服务器使用私钥A加密公钥M, 生成证书.

    • 证书里面有, 公钥M以及公钥M的哈希值
  • 私钥M就是p12文件. 拿到证书以后和私钥M绑定.

  • Mac电脑, 使用自己的私钥M对APP进行签名, 主要是macho的代码段进行签名

    • App含有 macho, App的签名, 证书
  • 苹果验证过程, 当APP装载到手机上的时候

    • 手机系统的公钥A, 解密APP中的证书, 得到公钥M
    • 公钥M验证APP的签名, 解密签名(对比macho的哈希值进行验证)

这样会出现问题, 一个证书可以无限安装了, 苹果无法控制.

于是有了一个证书可以安装几台设备, app的时效性等限制

苹果有了一个限制文件, 叫做权限文件, 就是我们现在的描述文件.

  • 申请证书的流程, 变成了申请描述文件的流程
    • 描述文件含有 appid, 设备IDs, 权限文件(推送, 后台运行, 调试器附加等), UUID, 证书等
  • 所以app在安装的时候, 安装的是一个描述文件, 不是证书了.
    • 描述文件是一个plist文件
    • 描述文件有签名认证的, 无法修改.

应用重签名原理

签名: 对原始数据哈希值进行签名

重签名: 对原始数据的哈希值使用我们自己的证书进行签名

Xcode利用codesign实现的. 安装xcode之后默认就有.

主要步骤如下, 还有用到一些命令行, 这里就不写了.

  • 删除插件和带有插件的.app包(比如Plugin, Watch)

  • Frameworks里面的库进行重签名

  • 给可执行文件 +x(可执行)权限

  • 添加描述文件(新建工程,真机编译得到,而且要运行,将描述文件安装到手机)

  • 替换BundleIDinfo.plist 文件。 BundleID要和描述文件中的ID保持一致)

  • 通过授权文件(Entilements)重签.app包、

    • 查看描述文件$security cms -D -i embedded.mobileprovision

    • 将描述文件中Entilements 拷贝出来,生成plist文件.(文件名称entitlements.plist)

  • 用权限文件签名APP包 $ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist xx.app

  • 最后通过Xcode安装

总结

本文以回忆, 记录为主.

文章分类
iOS
文章标签