ipa重签名(非越狱)

最近公司的项目突然遇到无法安装的情况(瞬间内心一万个草泥马飘过,好在不是自己维护的项目,不过问题还是要解决的)

,经过一番排查,发现是企业证书打包过期导致用户无法安装,不过有一个项目没有源码(包是经过第三方公司生成的,但是他们已经没有人在维护了,这时候我内心是这样的 ,按照他们官方的证书配置要求生成的推送pem一直无法打包,也不知道打包的错误信息)。既然正规渠道没有办法解决,只有去想想其他办法了,就简单研究下ipa的重签名,以下算是这个过程中学到的吧。

需要准备的东西

  • 证书 :开发证书或者企业证书
  • 应用描述文件:证书里面配置好下载的mobileprovision,重命名为embedded.mobileprovison然后安装
  • 需要重签的ipa包

重签方式

  • sigh脚本 :简单有效,成功 操作步骤:
  1. 把我们要重签名的ipa包和我们已安装的mobileprovison放在同一文件夹目录下(同级),
  2. 命令行cd到这个ipa文件夹目录下,执行sigh resign或者fastlane sigh resign命令,
  3. 这时候,sigh 会直接弹出下面这个指令要你输入:Signing Identity(这个就是你的证书的十六进制串),输入之后,然后你的ipa文件就直接被重签了,可以放到蒲公英等第三方平台测试ipa的正确性
  • iResign 重签名方案:导出ipa,但不可安装 下载 iResign,下载完成后直接打开可执行文件iReSign 这里证书、描述文件都可以自己去选,不过出现了一种情况,就是用新签名的包去测试的时候发现无法安装,可能是因为iResign好久没有维护了吧
  • MonkeyDev签名方案:成功生成测试ipa MonkeyDev是一个极为 方便逆向调试的平台,里面集成了常用的库、工具(如class-dump、restore-symbol、Reveal、Cycript),并且还可以更加方便的使用pod库来集成第三方库。 MonkeyDev 安装使用文档,按照文档可以很容易安装到手机和测试ipa,就是没有找到如何配置成企业分发ipa。
  • 脚本重签名:安装到手机上,暂时不知道怎么生成ipa
  1. 新建工程,并在工程根目录添加两个文件夹:APP和Temp(APP和Temp主要是跟脚本里面的ASSETS_PATH、TEMP_PATH一一对应,可修改),APP目录下放你要重签名的ipa,如图
  2. 添加脚本
  3. 脚本内容
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹
ASSETS_PATH="${SRCROOT}/APP"
#ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"

#新建Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"

#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"

#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

#----------------------------------------
#这一步可视账户情况去注释,企业账户可以注释掉,个人账户(或公司)可选择打开
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
#rm -rf "$TARGET_APP_PATH/PlugIns"
#rm -rf "$TARGET_APP_PATH/Watch"

#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
#  设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH"];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do

#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
复制代码
  1. 连接真机,运行程序,这样就可以安装到手机上了,使用xcode打包成ipa暂时不知道怎么处理。

总结一下

sigh脚本满足了我把无法安装的ipa重新签名成可打包使用的ipa;MonkeyDev可以把ipa打包成用于测试的ipa(测试版);脚本重签可以把ipa运行到手机上;iResign可以导出ipa,但是无法安装。所以说还是推荐用sigh,就两行命令,要重签成测试还是生产直接选择对应的证书就行了,

你可能感兴趣的:(ipa重签名(非越狱))