IPA 重新签名

1、需求:

  • 非企业证书签名的 ipa 想要在企业内分发。
  • 对商店中下载的应用砸壳并修改内容后,希望重新打包并安装到手机上;

这些都需要对ipa重新签名~

2、原理

移除原有签名,通过codesign工具对原 ipa 使用新证书重新签名并得到新的安装包。

1
2
3
4
5
$ codesign
Usage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign
codesign -v [-v*] [-R=<req string>|-R <req file path>] path|[+]pid ... # verify
codesign -d [options] path ... # display contents
codesign -h pid ... # display hosting paths

3、流程

3.1.准备工作:

  • 解压ipa
1
$ unzip xx.ipa
  • 找到开发者证书

证书可以在钥匙串中查找,也可以通过下面的命令行来查找:

1
$ security find-identity -p codesigning -v
  • 找到开发环境配置文件并复制到xx.app文件夹下

如果是自己的 ipa 那么这个.mobileprovision文件可以直接使用现成的,从Xcode->账户中找到,show in finder 后复制一份重命名为embedded.mobileprovision,拖到.app文件夹下即可

也可以使用命令行操作:

1
$ cp xx.mobileprovision Payload/xx.app/embedded.mobileprovision

注意:复制到xx.app目录下的配置文件一定要命名为embedded.mobileprovision

  • 修改包的 Bundle Identifier

如果是别人的 ipa 那么就要需要修改原安装包的info.plist中的Bundle identifier,使其与配置文件中的Bundle Identifier保持一致:

1
$ /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.xx.xx" Payload/xx.app/Info.plist
  • 生成新的 entitlements.plist

Entitlements 是应用功能和授权相关的文件,涉及到iCloud、推送等功能的配置信息。可以通过开发环境配置文件重新生成一份,后面签名要用到:

1
$ security cms -D -i xx.mobileprovision > profile.plist

上面会生成一个完整的 plist,我们只需要里面的Entitlements字段,执行命令行:

1
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist

结果如下:

plist

  • 移除之前的签名文件夹:
1
$ rm -rf Payload/xx.app/_CodeSignature

3.2.重新签名:

重新签名有顺序,先把frameworkdylib签名,最后再签名xx.app/xx,顺序弄错了,就算签名成功也可能会安装失败!

  • 重新签名framework:
1
$ codesign -f -s "iPhone Distribution: xxxx (xx)" --entitlements entitlements.plist /Payload/xx.app/Frameworks/yy.framework
  • 重新签名应用的执行文件
1
$ codesign -f -s "iPhone Distribution: xxxx (xx)" --entitlements entitlements.plist Payload/xx.app/xx
  • 查看应用签名信息
1
$ codesign -vv -d Payload/xx.app

3.3.调试

1
$ ios-deploy -d -b Payload/xx.app

出现success字样,就说明成功了~

如果遇到错误提示:“Error: There was an internal API error. AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0)”,就可能存在有 framework 或者 dylib 未签名的情况。这时就需要把 app 文件夹下的 framework 全都签名。

重新打包,生成新的ipa

1
$ zip -r new.ipa Payload/

接下来就可以通过 iTunes 或第三方工具安装到手机了~


相关参考:

#©传送门


IPA 重新签名
https://davidlii.cn/2019/03/15/resign.html
作者
Davidli
发布于
2019年3月15日
许可协议