ipa: 苹果应用安装包
ipa重签名: 第三方ipa在没有越狱的手机是无法正常安装的(排除企业证书分发),可以通过ipa重签名将我们自己的证书打进ipa,这样就可以安装了
⚠️ App Store下载的ipa包,需先进行砸壳。未脱壳的ipa即使重签名,安装到未越狱设备上无法启动
验签机制
- 资源文件:例如图片、html等
- CodeSignature:plist文件,是程序包中(不包括Frameworks)所有文件的签名,这意味着程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名
- 可执行文件:此文件跟资源文件一样需要签名
- mobileprovision:此文件用来校验
签名证书
和Bundle ID
,从苹果开发者中心进行生成 - Frameworks:程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,也包含签名信息CodeSignature文件
- 解压ipa;
- 取出embedded.mobileprovision,通过签名校验是否被篡改过
- 校验所有文件的签名,包括Frameworks
- 验证授权设备是否符合embedded.mobileprovision文件中的信息
- 比对Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的信息
签名方式
重签名的过程其实就是将新的签名证书
和mobileprovision
替换旧文件的过程,但由于系统在验证app是否合法的时候还会随机验证授权设备列表
和Bundle ID
、所以必须修改Bundle ID
与新的mobileprovision
中的信息保持一致,否则将会有验证失败的风险
- 完全重签名
签名证书
,mobileprovision
,
Bundle ID
三者信息对应一致
优点:与使用Xcode进行签名一样
缺点:维护成本较高,每一个重签名的ipa都必须修改Bundle ID
,并且匹配对应的签名证书
和mobileprovision
描述文件
适用范围:对签名稳定性有要求
- 不完全重签名
只保证签名证书
和mobileprovision
对应一致,至于这两者与原ipa
的Bundle ID
等信息是否一致则不考虑
优点:方便维护
缺点:只是对原ipa
的签名进行了替换,签名文件
和Bundle ID
并未匹配。签名不稳定,容易校验不过导致签名失败
适用范围:稳定性要求不高
重签名GUI工具
ipa: 要重签名的ipa
mobileprovision: 用来签名的provision文件
entitlements.plist: 授权机制
Appid:bundleid,与mobileprovision中对应
distributionName: 指该签名对应的证书的名字,在keychain中可以找到对应证书的名称
关于entitlements.plist的获取:
1. unzip xxx.ipa //解压ipa包,得到../Payload/xxx.app
2. cd ../Payload
3. /usr/libexec/PlistBuddy -x -c "print:Entitlements " /dev/stdin <<< $(security cms -D -i xxx.app/embedded.mobileprovision) > Entitlements.plist
4. 修改entitlements.plist文件中的bundle id
这个项目是在iResign基础上开发的。可以对.app重签名打包成ipa,需要在.app包中提供对应的embedded.mobileprovision文件
使用codesign命令进行签名
1.解压ipa包
unzip xxx.ipa
2.删除签名文件
rm -rf Payload/xxx.app/_CodeSignature/
3.替换配置文件
cp embedded.mobileprovision Payload/xxx.app/
4.签名
codesign -f -s "证书名称" --entitlements entitlements.plist Payload/xxx.app
5.打包
zip -r xxx.ipa Payload/
6.删除解压文件
rm -r Payload