ipa重簽名的四種方式

一 開發(fā)者調(diào)試安裝app到手機(jī)的簽名過程

  1. Mac電腦生成公鑰M和私鑰M
  2. 公鑰M傳給蘋果服務(wù)器,蘋果服務(wù)器的私鑰A對公鑰M進(jìn)行加密生成證書返回給xcode
  3. Xcode下載profile等描述文件,用公鑰M對app進(jìn)行加密生成app簽名,然后把a(bǔ)pp簽名和證書以及profile文件一起打包成ipa
  4. 手機(jī)進(jìn)行兩次解密,手機(jī)用手機(jī)系統(tǒng)里的公鑰A對證書進(jìn)行解密得到公鑰M,然后對比profile描述文件,查看權(quán)限,看是否合法;然后用公鑰M對app簽名進(jìn)行解密
  5. 手機(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,都沒有加密

三 重簽名方式之一 手動重簽名

  1. 新建工程codesignDemo,選擇證書和真機(jī)調(diào)試
  2. 進(jìn)入包內(nèi)容,因?yàn)槊赓M(fèi)證書無法重簽名插件,所以刪除PlugIns文件夾,Watch里也有插件,也刪除
  3. 對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一樣的證書
  1. 給可執(zhí)行文件執(zhí)行權(quán)限:chmod +x iQiYiPhoneVideo
  2. codesignDemo工程里的Products里的codesignDemo.app顯示包內(nèi)容,找到包內(nèi)容里的embedded.mobileprovision文件,拷貝到需要重簽名的愛奇藝.app包內(nèi)容中
  3. codesignDemo工程的Bundle identifier拷貝到愛奇藝.app的包內(nèi)容中的Info.plist的Bundle identifier
  4. 找到第五步的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>
  1. 把第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
  1. 安裝到手機(jī)上
    打包為ipa: zip -ry newAiqiyi.ipa new 把new文件夾打包為newAiqiyi.ipa
    安裝:Xcode command+shift+2進(jìn)入到設(shè)備管理,選擇+號找到剛才的newAiqiyi.ipa

四 重簽名方式之二 Xcode重簽名

  1. 新建工程codesignDemo,選擇證書和真機(jī)調(diào)試
  2. 把iQiYiPhoneVideo.app替換codesignDemo工程的Products的codesignDemo.app替換成iQiYiPhoneVideo.app,并把iQiYiPhoneVideo.app改名為codesignDemo.app
  3. 進(jìn)入替換后的codesignDemo.app包內(nèi)容中,刪除PlugIns文件夾和Watch文件夾
  4. 重簽名對Frameworks里的framework進(jìn)行重簽名,有些包沒有Frameworks就忽略這步
  5. 改替換后的codesignDemo.app包中的Info.plist的Bundle identifier改為codesignDemo工程的Bundle identifier
  6. 給可執(zhí)行文件執(zhí)行權(quán)限:chmod +x iQiYiPhoneVideo
  7. 運(yùn)行工程codesignDemo

五 重簽名方式之三 腳本重簽名

  1. 新建工程cosignAutoDemo,選擇證書和真機(jī)調(diào)試,在工程根目錄里新建APP和Temp文件夾:


    屏幕快照 2018-05-14 下午1.07.08.png
  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拷貝進(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

  1. 在APP文件夾下放ipa包,然后運(yùn)行

也可以把腳本保存成xcodeCodesign.sh文件,然后在Run Script的shell的代碼處,寫入xcodeCodesign.sh文件的路徑;最后要chmod +x xcodeCodesign.sh,就可以運(yùn)行了

六 重簽名方式之四 MonkeyDev重簽名

  1. MonkeyDev安裝
  2. 新建MonkeyApp工程monkeyDemo
  3. 在monkeyDemo文件夾的TargetApp里放ipa包,然后運(yùn)行
    手動重簽名,由于證書等多方面細(xì)節(jié)問題容易簽名失敗;Xcode重簽名腳本重簽名和MonkeyDev最好用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容