iOS ipa重签名

3,695 阅读3分钟

ipa: 苹果应用安装包

ipa重签名: 第三方ipa在没有越狱的手机是无法正常安装的(排除企业证书分发),可以通过ipa重签名将我们自己的证书打进ipa,这样就可以安装了

⚠️ App Store下载的ipa包,需先进行砸壳。未脱壳的ipa即使重签名,安装到未越狱设备上无法启动

验签机制

  1. 资源文件:例如图片、html等
  2. CodeSignature:plist文件,是程序包中(不包括Frameworks)所有文件的签名,这意味着程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名
  3. 可执行文件:此文件跟资源文件一样需要签名
  4. mobileprovision:此文件用来校验签名证书Bundle ID,从苹果开发者中心进行生成
  5. Frameworks:程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,也包含签名信息CodeSignature文件

  1. 解压ipa;
  2. 取出embedded.mobileprovision,通过签名校验是否被篡改过
  3. 校验所有文件的签名,包括Frameworks
  4. 验证授权设备是否符合embedded.mobileprovision文件中的信息
  5. 比对Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的信息

签名方式

重签名的过程其实就是将新的签名证书mobileprovision替换旧文件的过程,但由于系统在验证app是否合法的时候还会随机验证授权设备列表Bundle ID、所以必须修改Bundle ID新的mobileprovision中的信息保持一致,否则将会有验证失败的风险

  • 完全重签名

签名证书mobileprovision

Bundle ID三者信息对应一致

优点:与使用Xcode进行签名一样

缺点:维护成本较高,每一个重签名的ipa都必须修改Bundle ID,并且匹配对应的签名证书mobileprovision描述文件

适用范围:对签名稳定性有要求

  • 不完全重签名

只保证签名证书mobileprovision对应一致,至于这两者与原ipaBundle ID 等信息是否一致则不考虑

优点:方便维护

缺点:只是对原ipa的签名进行了替换,签名文件Bundle ID并未匹配。签名不稳定,容易校验不过导致签名失败

适用范围:稳定性要求不高

重签名GUI工具

iReSign

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

iOS App Signer

这个项目是在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