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也須要對應。

相關文章
相關標籤/搜索