iOS App 簽名過程及重簽

iOS App 簽名

目的:

保證 iOS 平臺(tái)對(duì)第三方 APP 有絕對(duì)的控制權(quán),每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的扎拣。

簽名過程

image.png
  1. 在你的 Mac 開發(fā)機(jī)器生成一對(duì)公私鑰赴肚,這里稱為公鑰L,私鑰L二蓝。L:Local
  2. 蘋果自己有固定的一對(duì)公私鑰誉券,跟上面 AppStore 例子一樣,私鑰在蘋果后臺(tái)刊愚,公鑰在每個(gè) iOS 設(shè)備上踊跟。這里稱為公鑰A,私鑰A鸥诽。A:Apple
  3. 把公鑰 L 傳到蘋果后臺(tái)商玫,用蘋果后臺(tái)里的私鑰 A 去簽名公鑰 L。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名牡借,把這份數(shù)據(jù)稱為證書拳昌。
  4. 在蘋果后臺(tái)申請(qǐng) AppID,配置好設(shè)備 ID 列表和 APP 可使用的權(quán)限钠龙,再加上第③步的證書炬藤,組成的數(shù)據(jù)用私鑰 A 簽名御铃,把數(shù)據(jù)和簽名一起組成一個(gè) Provisioning Profile 文件,下載到本地 Mac 開發(fā)機(jī)刻像。
  5. 在開發(fā)時(shí)畅买,編譯完一個(gè) APP 后,用本地的私鑰 L 對(duì)這個(gè) APP 進(jìn)行簽名细睡,同時(shí)把第④步得到的 Provisioning Profile 文件打包進(jìn) APP 里谷羞,文件名為 embedded.mobileprovision,把 APP 安裝到手機(jī)上溜徙。
  6. 在安裝時(shí)湃缎,iOS 系統(tǒng)取得證書,通過系統(tǒng)內(nèi)置的公鑰 A蠢壹,去驗(yàn)證 embedded.mobileprovision 的數(shù)字簽名是否正確嗓违,里面的證書簽名也會(huì)再驗(yàn)一遍。
  7. 確保了 embedded.mobileprovision 里的數(shù)據(jù)都是蘋果授權(quán)以后图贸,就可以取出里面的數(shù)據(jù)蹂季,做各種驗(yàn)證,包括用公鑰 L 驗(yàn)證APP簽名疏日,驗(yàn)證設(shè)備 ID 是否在 ID 列表上偿洁,AppID 是否對(duì)應(yīng)得上,權(quán)限開關(guān)是否跟 APP 里的 Entitlements 對(duì)應(yīng)等沟优。

概念和操作

上面的步驟對(duì)應(yīng)到我們平常具體的操作和概念是這樣的:

  1. 第 1 步對(duì)應(yīng)的是 keychain 里的 “從證書頒發(fā)機(jī)構(gòu)請(qǐng)求證書”涕滋,這里就本地生成了一對(duì)公私鑰,保存的 CertificateSigningRequest 就是公鑰挠阁,私鑰保存在本地電腦里宾肺。
  2. 第 2 步蘋果處理,不用管侵俗。
  3. 第 3 步對(duì)應(yīng)把 CertificateSigningRequest 傳到蘋果后臺(tái)生成證書锨用,并下載到本地。這時(shí)本地有兩個(gè)證書隘谣,一個(gè)是第 1 步生成的黔酥,一個(gè)是這里下載回來的,keychain 會(huì)把這兩個(gè)證書關(guān)聯(lián)起來洪橘,因?yàn)樗麄児借€是對(duì)應(yīng)的跪者,在XCode選擇下載回來的證書時(shí),實(shí)際上會(huì)找到 keychain 里對(duì)應(yīng)的私鑰去簽名熄求。這里私鑰只有生成它的這臺(tái) Mac 有渣玲,如果別的 Mac 也要編譯簽名這個(gè) App 怎么辦?答案是把私鑰導(dǎo)出給其他 Mac 用,在 keychain 里導(dǎo)出私鑰死嗦,就會(huì)存成 .p12 文件虱岂,其他 Mac 打開后就導(dǎo)入了這個(gè)私鑰回懦。
  4. 第 4 步都是在蘋果網(wǎng)站上操作,配置 AppID / 權(quán)限 / 設(shè)備等渺蒿,最后下載 Provisioning Profile 文件拗慨。
  5. 第 5 步 XCode 會(huì)通過第 3 步下載回來的證書(存著公鑰)陷寝,在本地找到對(duì)應(yīng)的私鑰(第一步生成的)搀捷,用本地私鑰去簽名 App星掰,并把 Provisioning Profile 文件命名為 embedded.mobileprovision 一起打包進(jìn)去。這里對(duì) App 的簽名數(shù)據(jù)保存分兩部分嫩舟,Mach-O 可執(zhí)行文件會(huì)把簽名直接寫入這個(gè)文件里氢烘,其他資源文件則會(huì)保存在 _CodeSignature 目錄下。
  6. 第 6 – 7 步的打包和驗(yàn)證都是 Xcode 和 iOS 系統(tǒng)自動(dòng)做的事家厌。

這里再總結(jié)一下這些概念:

  1. 證書:內(nèi)容是公鑰或私鑰播玖,由其他機(jī)構(gòu)對(duì)其簽名組成的數(shù)據(jù)包。
  2. Entitlements:包含了 App 權(quán)限開關(guān)列表饭于。
  3. CertificateSigningRequest:本地公鑰蜀踏。
  4. p12:本地私鑰,可以導(dǎo)入到其他電腦掰吕。
  5. Provisioning Profile:包含了 證書 / Entitlements 等數(shù)據(jù)脓斩,并由蘋果后臺(tái)私鑰簽名的數(shù)據(jù)包。

iOS APP 重簽名具體操作(手動(dòng))

  1. 干掉插件Plugins文件夾里面的內(nèi)容!

  2. Watch 文件刪除

  3. 對(duì) Frameworks 進(jìn)行簽名!

    `$ codesign -fs "證書" xxx.framework`
    
  4. 給可執(zhí)行文件執(zhí)行權(quán)限! chmod +x WeChat

  5. 拷貝描述文件(可新建工程畴栖,獲取app包中embedded.mobileprovision)

  6. 修改info.plist 的Bundle ID(與描述文件工程一致)

  7. 生成plist的權(quán)限文件en.plist(復(fù)制embedded.mobileprovision權(quán)限內(nèi)容),放到Payload目錄下

    <key>keychain-access-groups</key>
            <array>
                <string>X7Y****CQ.*</string>
            </array>
            <key>get-task-allow</key>
            <true/>
            <key>application-identifier</key>
            <string>X7Y****JCQ.*</string>
            <key>com.apple.developer.team-identifier</key>
            <string>X7Y****CQ</string>
    
  8. 簽名整個(gè)APP!

    $ codesign -fs "iPhone Developer: xxxxxx (6ZBE4C573L)"  --no-strict --entitlements=en.plist WeChat.app
    
  9. 打包其實(shí)就是一個(gè)zip

    $ zip -ry WeChat.ipa Payload
    

iPhone Developer: shan jingjing (3QDN5929LL)

  1. 安裝到手機(jī)

Xcode->Window->Devices and Simulators->Devices INSTALL APP 點(diǎn)擊+選中WeChat.ipa

iOS APP 利用Xcode重簽名

  1. 創(chuàng)建工程八千,替換Product下的app

  2. 修改Bundle identifier與新建工程一致

  3. Plugins吗讶、Watch 文件刪除

  4. Framework重簽名

    `$ codesign -fs "證書" xxx.framework`
    
  5. 給可執(zhí)行文件執(zhí)行權(quán)限! chmod +x WeChat

  6. Xcode 運(yùn)行安裝至手機(jī)

iOS APP 腳本自動(dòng)化重簽名

  1. 新建工程,添加Run Script腳本
image.png
# ${SRCROOT} 它是工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾
ASSETS_PATH="${SRCROOT}/TargetAPP"
#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"
# 拿到解壓的臨時(shí)的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.個(gè)人證書沒法簽名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

if test -f  $FRAMEWORK
    then
    #簽名
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    fi
done
fi



命令

查看描述文件信息:$ security cms -D -i 描述文件路徑

查看APP的簽名信息
$ codesign -vv -d APP路徑(.app)

查看本機(jī)所有證書
$ security find-identity -v -p codesigning

查看可執(zhí)行文件的加密信息!
$ otool -l WeChat | grep crypt

簽名
$ codesign -fs "證書" 需要簽名的文件

參考

iOS App 簽名的原理

[toc]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恋捆,一起剝皮案震驚了整個(gè)濱河市照皆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沸停,老刑警劉巖膜毁,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愤钾,居然都是意外死亡瘟滨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門能颁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杂瘸,“玉大人,你說我怎么就攤上這事伙菊“苡瘢” “怎么了敌土?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)运翼。 經(jīng)常有香客問我返干,道長(zhǎng),這世上最難降的妖魔是什么血淌? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任矩欠,我火速辦了婚禮,結(jié)果婚禮上六剥,老公的妹妹穿的比我還像新娘晚顷。我一直安慰自己,他們只是感情好疗疟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布该默。 她就那樣靜靜地躺著,像睡著了一般策彤。 火紅的嫁衣襯著肌膚如雪栓袖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天店诗,我揣著相機(jī)與錄音裹刮,去河邊找鬼。 笑死庞瘸,一個(gè)胖子當(dāng)著我的面吹牛捧弃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播擦囊,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼违霞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瞬场?” 一聲冷哼從身側(cè)響起买鸽,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贯被,沒想到半個(gè)月后眼五,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彤灶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年看幼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幌陕。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桌吃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苞轿,到底是詐尸還是另有隱情茅诱,我是刑警寧澤逗物,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站瑟俭,受9級(jí)特大地震影響翎卓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摆寄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一失暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧微饥,春花似錦逗扒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肃续,卻和暖如春黍檩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背始锚。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工刽酱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞧捌。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓棵里,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親姐呐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殿怜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容