iOS应用签名与重签
-
代码签名
- 代码签名是对可执行文件或脚本进行
数字签名,用来确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已。
-
双层签名
- 为了实现以下需求,苹果采用
双层签名机制:
- 安装包不需要上传到
App Store,可以直接安装到手机上
- 为了保证系统安全性,必须对
APP有绝对控制权
- 经过苹果允许才能安装
- 不能被滥用导致非开发APP也能被安装
双层签名原理及流程如下图:
-
描述文件
- 描述文件(
Provisioning Profile)一般包括三样东西:
- 当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性。
security cms -Di embedded.mobileprovision 在终端查看描述文件
- 带有
描述文件的双层签名机制,可以实现控制安装设备,设备权限,安装数量等等限制,具体原理及签名流程如下图:
利用codesign进行重签名
-
重签步骤
- 删除插件(
Plugin)和带有插件的.app包(比如Apple Watch)
- 对
Frameworks里面的库进行重签名
- 对可执行文件进行
+x(可执行)权限
- 添加描述文件(新建工程,真机编译得到)
- 修改
plist文件中的BundleID
- 通过授权文件(
Eltilements)重签.app包
-
相关命令
codesign -vv -d xxx.app 查看ipa包的信息
security find-identity -v -p codesigning 查看本机的证书信息
otool -l xxx > ~/Downloads/macho.txt 将MachO文件内容重定向到指定位置
MachO文件中的cryptid字段,0代表未加密,1代表加密
codesign -fs "Apple Development: xxx@163.com (xxx)" xxx.framework 对framework进行覆盖签名
chmod +x xxx 给可执行文件添加执行权限
security cms -Di embedded.mobileprovision 查看描述文件
codesign -fs security "Apple Development: 18686886570@163.com (G998TYF5HA)" --no-strict --entitlements=xxx.plist xxx.app 对.app进行重签
利用Xcode进行重签名
- 新建项目并真机运行(将自己的证书安装到设备上)
- 删除插件(
Plugin)和带有插件的.app包(比如Apple Watch)
- 对
Frameworks里面的库进行重签名
- 用需要重签名的包(
.app)替换掉刚刚真机运行编译的包
Xcode Run!