ipa重签名

将一个ipa文件解压后,显示包内容,能够看到app文件目录下包含了这2个文件:_CodeSignature(ipa的签署文件)和embedded.mobileprovision(证书配置文件),另外还有一个本身配置的entitlements.plist受权文件,它们就是重签名的关键。bash

为了方便描述,先定义一些文件名(请根据本身的状况修改):app

假设你的证书名为 myInhouse. mobileprovisionide

假设你的inhouse签署名为 iPhone Distribution: ABCD technology co., LTD.spa

假设你的ipa包名为 efg.ipacode

1、查看证书信息、配置权限

首先,查看myInhouse. mobileprovision的信息,在终端输入命令:ip

security cms -D -i myInhouse.mobileprovision

执行后输出信息中的内容,获得一个 XML 格式信息,找到Entitlements字段;it

而后,建立一个 entitlements.plist 文件,按照上图中Entitlements的信息配置,以下图:io

2、编写resign.sh脚本

编写脚本,命名为 resign.shclass

#!/bin/sh

if ! ([ -f "$1" ]); then
echo ----- \"${1}\"文件不存在
exit
fi
ipaName=${1%.ipa}
if [ "$ipaName" = "$1" ]; then
echo ----- \"${1}\"error 不是ipa文件
exit
fi

## step 1 解压ipa
unzip ${ipaName}.ipa

## step 2 删除旧签名文件 
rm -rf Payload/*.app/_CodeSignature/

## step 3 拷贝证书配置和权限文件
cp myInhouse.mobileprovision Payload/*.app/embedded.mobileprovision
cp entitlements.plist Payload/*.app/

## step 4 重签名
(
/usr/bin/codesign -f -s "iPhone Distribution: ABCD technology co., LTD." --entitlements Payload/*.app/entitlements.plist Payload/*.app/
) || { 
rm -rf Payload/ 
rm -rf __MACOSX/
exit 
}

## step 5 打包
zip -r ${ipaName}_resign.ipa Payload/
rm -rf Payload/
rm -rf __MACOSX/

3、签名

脚本写完后,将 entitlements.plist 、myInhouse.mobileprovision 、resign.sh 、efg.ipa 放到同一目录ipaResign下,mobile

而后打开终端,cd至ipaResig目录,再执行以下命令运行脚本:

sh resign.sh efg.ipa

稍稍等候,efg_resign.ipa 就OK啦。

安装完efg_resign.ipa不要忘记信任企业证书,否则进不了应用。

上述工做完成后,若是之后还有须要用同一个证书重签名的,直接将ipa丢到ipaResign,运行脚本就能够了,是否是很方便 😊。

 

--2016-8-10--补-充--------------我---是---分---割---线----------------


补充一下签名成development和distribution的不一样之处。

4、重签成development 

虽然不多有需求要这么作,可是最近碰到一个朋友就遇到了。(我能说什么呢..... -.-!)

首先,须要知道应用的惟一标识(application-identifier)是:证书ID+Bundle Identifier;

证书ID能够在钥匙串中看到,如图,图里括号中的7N2275G95N就是证书ID。

签成development的时候,上面脚本中 step 4 的签署名要与钥匙串中的对应,包括括号和证书ID,因此脚本中第4步应该改为:

## step 4 
(
/usr/bin/codesign -f -s "iPhone Developer: developerName (7N2275G95N)" --entitlements Payload/*.app/entitlements.plist Payload/*.app/
) || { 
rm -rf Payload/ 
rm -rf __MACOSX/
exit 
}

这里要特别注意:第4步写developer的证书ID,可是在受权文件 entitlements.plist 中,前缀不能是developer的,而应该与mobileprovision文件中的证书ID一致(查看mobileprovision文件信息参考第一步)。

其他参考第二步。

5、签成distribution

参考第四步,惟一的不一样是脚本 step 4 中的签署名要改为发布的签署,证书ID也须要对应。

相关文章
相关标签/搜索