ipa重簽名的四種方式
一 開發者除錯安裝app到手機的簽名過程
1. Mac電腦生成公鑰M和私鑰M 2. 公鑰M傳給蘋果伺服器,蘋果伺服器的私鑰A對公鑰M進行加密生成證書返回給xcode 3. Xcode下載profile等描述檔案,用公鑰M對app進行加密生成app簽名,然後把app簽名和證書以及profile檔案一起打包成ipa 4. 手機進行兩次解密,手機用手機系統裡的公鑰A對證書進行解密得到公鑰M,然後對比profile描述檔案,檢視許可權,看是否合法;然後用公鑰M對app簽名進行解密 5. 手機裡的公鑰A與蘋果伺服器私鑰A相對應 過程如下圖:
二 加密和重簽名相關的命令
-
1.base64加密檔案:base64 test.txt -o new.txt
-
2. base64解密: base64 new.txt -o abc.txt -D
-
3. openssl生成私鑰: openssl genrsa -out private.pem 512
-
4. 由私鑰生成公鑰: openssl rsa -in private.pem -out public.pem -pubout
-
5. 檢視rsa的明文:openssl rsa -in private.pem -text -out private.text
-
6. 檢視csr解密資訊:openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
-
7. 檢視profile檔案資訊: /Users/mac/Library/MobileDevice/Provisioning\ Profiles 然後security cms -D -i e871987c-b4c5-4658-8338-f6e4cabaff8e.mobileprovision
-
8. 檢視簽名信息:ipa包解壓開啟,進入Payload,檢視.app的簽名信息 codesign -vv -d QQMusic.app
-
9. 檢視所有證書:security find-identity -v -p codesigning
-
10. 檢視可執行檔案macho的加密資訊:.app顯示包內容,找到同名的可執行檔案otool -l QQMusic | grep crypt得到以下結果:
-
cryptoff 16384
-
cryptsize 50085888
-
cryptid 0
-
cryptoff 16384
-
cryptsize 55115776
-
cryptid 0
-
兩個架構的cryptid都是0,都沒有加密
三 重簽名方式之一 手動重簽名 1. 新建工程codesignDemo,選擇證書和真機除錯 2. 進入包內容,因為免費證書無法重簽名外掛,所以刪除PlugIns資料夾,Watch裡也有外掛,也刪除 3. 對Frameworks裡的framework進行重簽名,有些包沒有Frameworks就忽略這步: 進入Frameworks 資料夾;然後一個一個的重簽名
-
security find-identity -v -p codesigning //檢視所有證書
-
codesign -fs "iPhone Developer: [email protected] (Q4M32A5HU5)" QYUniversalFramework.framework //選擇和工程codesignDemo一樣的證書
4. 給可執行檔案執行許可權: chmod +x iQiYiPhoneVideo 5. codesignDemo工程裡的Products裡的codesignDemo.app顯示包內容,找到包內容裡的embedded.mobileprovision檔案,拷貝到需要重簽名的愛奇藝.app包內容中 6. codesignDemo工程的Bundle identifier拷貝到愛奇藝.app的包內容中的Info.plist的Bundle identifier 7. 找到第五步的embedded.mobileprovision檔案,然後security cms -D -i embedded.mobileprovision找到<key>Entitlements</key>,然後把<key>Entitlements</key>下面的:
-
<dict>
-
<key>keychain-access-groups</key>
-
<array>
-
<string>9D3898Q5N5.*</string>
-
</array>
-
<key>get-task-allow</key>
-
<true/>
-
<key>application-identifier</key>
-
<string>9D3898Q5N5.www.demo.com.codesignDemo</string>
-
<key>com.apple.developer.team-identifier</key>
-
<string>9D3898Q5N5</string>
-
</dict>
用Xcode生成plist檔案PropertyList.plist,然後Open As -> Source Code,把剛才的<dict>拷貝進去,得到如下:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-
<!--
-
PropertyList.plist
-
codesignDemo
-
Created by mac on 2018/5/14.
-
Copyright (c) 2018年 meryin. All rights reserved.
-
-->
-
<plist version="1.0">
-
<dict>
-
<key>keychain-access-groups</key>
-
<array>
-
<string>9D3898Q5N5.*</string>
-
</array>
-
<key>get-task-allow</key>
-
<true/>
-
<key>application-identifier</key>
-
<string>9D3898Q5N5.www.demo.com.codesignDemo</string>
-
<key>com.apple.developer.team-identifier</key>
-
<string>9D3898Q5N5</string>
-
</dict>
-
</plist>
8. 把第7步得到的plist檔案,和.app放在一個資料夾new中,進行重簽名
-
➜ new ls
-
PropertyList.plist iQiYiPhoneVideo.app
-
➜ security find-identity -v -p codesigning
-
1) C5FF31245563ADB609BEAC77D10B9C96F0EB586A "iPhone Developer: [email protected] (Q4M32A5HU5)"
-
1 valid identities found
-
➜ codesign -fs "iPhone Developer: [email protected] (Q4M32A5HU5)" --no-strict --entitlements=PropertyList.plist iQiYiPhoneVideo.app //用工程codesignDemo的證書進行重簽名
9. 安裝到手機上 打包為ipa: zip -ry newAiqiyi.ipa new 把new資料夾打包為newAiqiyi.ipa
安裝:Xcode command+shift+2進入到裝置管理,選擇+號找到剛才的newAiqiyi.ipa
四 重簽名方式之二 Xcode重簽名
1. 新建工程codesignDemo,選擇證書和真機除錯 2. 把iQiYiPhoneVideo.app替換codesignDemo工程的Products的codesignDemo.app替換成iQiYiPhoneVideo.app,並把iQiYiPhoneVideo.app改名為codesignDemo.app 3. 進入替換後的codesignDemo.app包內容中,刪除PlugIns資料夾和Watch資料夾 4. 重簽名對Frameworks裡的framework進行重簽名,有些包沒有Frameworks就忽略這步 5. 改替換後的codesignDemo.app包中的Info.plist的Bundle identifier改為codesignDemo工程的Bundle identifier 6. 給可執行檔案執行許可權:chmod +x iQiYiPhoneVideo 8. 執行工程codesignDemo五 重簽名方式之三 指令碼重簽名 1. 新建工程cosignAutoDemo,選擇證書和真機除錯,在工程根目錄裡新建APP和Temp資料夾: 2. xcode->Build Phases->+New Run Script Phase 3. 在Run Script的shell程式碼如下:
-
# ${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
4. 在APP資料夾下放ipa包,然後執行
也可以把指令碼儲存成xcodeCodesign.sh檔案,然後在Run Script的shell的程式碼處,寫入xcodeCodesign.sh檔案的路徑;最後要chmod +x xcodeCodesign.sh,就可以運行了
六 重簽名方式之四 MonkeyDev重簽名 1. MonkeyDev安裝 2. 新建MonkeyApp工程monkeyDemo
3. 在monkeyDemo資料夾的TargetApp裡放ipa包,然後執行
手動重簽名,由於證書等多方面細節問題容易簽名失敗;Xcode重簽名指令碼重簽名和MonkeyDev最好用