代码签名
代码签名 就是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的目的。
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(可执行)权限
-
添加描述文件(新建工程,真机编译得到,而且要运行,将描述文件安装到手机)
-
替换
BundleID(info.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安装
总结
本文以回忆, 记录为主.