一 開發(fā)者調(diào)試安裝app到手機(jī)的簽名過程
- Mac電腦生成公鑰M和私鑰M
- 公鑰M傳給蘋果服務(wù)器,蘋果服務(wù)器的私鑰A對公鑰M進(jìn)行加密生成證書返回給xcode
- Xcode下載profile等描述文件,用公鑰M對app進(jìn)行加密生成app簽名,然后把a(bǔ)pp簽名和證書以及profile文件一起打包成ipa
- 手機(jī)進(jìn)行兩次解密,手機(jī)用手機(jī)系統(tǒng)里的公鑰A對證書進(jìn)行解密得到公鑰M,然后對比profile描述文件,查看權(quán)限,看是否合法;然后用公鑰M對app簽名進(jìn)行解密
-
手機(jī)里的公鑰A與蘋果服務(wù)器私鑰A相對應(yīng)
過程如下圖:
屏幕快照 2018-05-11 下午5.55.27.png
二 加密和重簽名相關(guān)的命令
- base64加密文件:
base64 test.txt -o new.txt - base64解密:
base64 new.txt -o abc.txt -D - openssl生成私鑰:
openssl genrsa -out private.pem 512 - 由私鑰生成公鑰:
openssl rsa -in private.pem -out public.pem -pubout - 查看rsa的明文:
openssl rsa -in private.pem -text -out private.text - 查看csr解密信息:
openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest - 查看profile文件信息:
/Users/mac/Library/MobileDevice/Provisioning\ Profiles 然后security cms -D -i e871987c-b4c5-4658-8338-f6e4cabaff8e.mobileprovision - 查看簽名信息:ipa包解壓打開,進(jìn)入Payload,查看.app的簽名信息
codesign -vv -d QQMusic.app - 查看所有證書:
security find-identity -v -p codesigning - 查看可執(zhí)行文件macho的加密信息:.app顯示包內(nèi)容,找到同名的可執(zhí)行文件
otool -l QQMusic | grep crypt得到以下結(jié)果:
cryptoff 16384
cryptsize 50085888
cryptid 0
cryptoff 16384
cryptsize 55115776
cryptid 0
兩個架構(gòu)的cryptid都是0,都沒有加密
三 重簽名方式之一 手動重簽名
- 新建工程codesignDemo,選擇證書和真機(jī)調(diào)試
- 進(jìn)入包內(nèi)容,因?yàn)槊赓M(fèi)證書無法重簽名插件,所以刪除PlugIns文件夾,Watch里也有插件,也刪除
- 對Frameworks里的framework進(jìn)行重簽名,有些包沒有Frameworks就忽略這步:
進(jìn)入Frameworks 文件夾;然后一個一個的重簽名
security find-identity -v -p codesigning //查看所有證書
codesign -fs "iPhone Developer: clwmac@icloud.com (Q4M32A5HU5)" QYUniversalFramework.framework //選擇和工程codesignDemo一樣的證書
- 給可執(zhí)行文件執(zhí)行權(quán)限:
chmod +x iQiYiPhoneVideo - codesignDemo工程里的Products里的codesignDemo.app顯示包內(nèi)容,找到包內(nèi)容里的embedded.mobileprovision文件,拷貝到需要重簽名的愛奇藝.app包內(nèi)容中
- codesignDemo工程的Bundle identifier拷貝到愛奇藝.app的包內(nèi)容中的Info.plist的Bundle identifier
- 找到第五步的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>拷貝進(jìn)去,得到如下:
<?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>
- 把第7步得到的plist文件,和.app放在一個文件夾new中,進(jìn)行重簽名
? new ls
PropertyList.plist iQiYiPhoneVideo.app
? security find-identity -v -p codesigning
1) C5FF31245563ADB609BEAC77D10B9C96F0EB586A "iPhone Developer: clwmac@icloud.com (Q4M32A5HU5)"
1 valid identities found
? codesign -fs "iPhone Developer: clwmac@icloud.com (Q4M32A5HU5)" --no-strict --entitlements=PropertyList.plist iQiYiPhoneVideo.app //用工程codesignDemo的證書進(jìn)行重簽名
iQiYiPhoneVideo.app: replacing existing signature
- 安裝到手機(jī)上
打包為ipa:zip -ry newAiqiyi.ipa new把new文件夾打包為newAiqiyi.ipa
安裝:Xcode command+shift+2進(jìn)入到設(shè)備管理,選擇+號找到剛才的newAiqiyi.ipa
四 重簽名方式之二 Xcode重簽名
- 新建工程codesignDemo,選擇證書和真機(jī)調(diào)試
- 把iQiYiPhoneVideo.app替換codesignDemo工程的Products的codesignDemo.app替換成iQiYiPhoneVideo.app,并把iQiYiPhoneVideo.app改名為codesignDemo.app
- 進(jìn)入替換后的codesignDemo.app包內(nèi)容中,刪除PlugIns文件夾和Watch文件夾
- 重簽名對Frameworks里的framework進(jìn)行重簽名,有些包沒有Frameworks就忽略這步
- 改替換后的codesignDemo.app包中的Info.plist的Bundle identifier改為codesignDemo工程的Bundle identifier
- 給可執(zhí)行文件執(zhí)行權(quán)限:chmod +x iQiYiPhoneVideo
- 運(yùn)行工程codesignDemo
五 重簽名方式之三 腳本重簽名
-
新建工程cosignAutoDemo,選擇證書和真機(jī)調(diào)試,在工程根目錄里新建APP和Temp文件夾:
屏幕快照 2018-05-14 下午1.07.08.png xcode->Build Phases->+New Run Script Phase
在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拷貝進(jìn)入工程下
# 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
# 設(shè)置:"Set : KEY Value" "目標(biāo)文件路徑"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 給MachO文件上執(zhí)行權(quán)限
# 拿到MachO文件的路徑
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可執(zhí)行權(quán)限
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
- 在APP文件夾下放ipa包,然后運(yùn)行
也可以把腳本保存成xcodeCodesign.sh文件,然后在Run Script的shell的代碼處,寫入xcodeCodesign.sh文件的路徑;最后要chmod +x xcodeCodesign.sh,就可以運(yùn)行了
六 重簽名方式之四 MonkeyDev重簽名
- MonkeyDev安裝
- 新建MonkeyApp工程monkeyDemo
- 在monkeyDemo文件夾的TargetApp里放ipa包,然后運(yùn)行
手動重簽名,由于證書等多方面細(xì)節(jié)問題容易簽名失敗;Xcode重簽名腳本重簽名和MonkeyDev最好用

