ios重签名shell脚本_03:双层签名和重签名流程以及shell脚本重签名
復習
1:雙向簽名7不流程
2:查看簽名信息和證書信息
3:查看用戶權(quán)限
4:shell腳本簽名
目錄
1:雙向簽名7不流程
2:查看簽名信息和證書信息
3:查看用戶權(quán)限
4:shell腳本簽名
正文
一:雙層簽名、雙向驗證
雙層簽名、雙向驗證。
1:簽名示意圖
2:兩對秘鑰、雙層簽名、雙向認證
公鑰M,私鑰M(他們是一對)
蘋果服務器:私鑰A,
iOS手機系統(tǒng):公鑰A
2.1:Mac電腦通過csr文件向蘋果服務器申請證書,
csr里面有公鑰M,其他的必要信息,
2.2:蘋果服務器會把證書給mac電腦。
證書:證書是蘋果服務器用私鑰A對公鑰M的一個簽名。
包含了公鑰M,和公鑰M的簽名信息,簽名信息使用私鑰A來簽名的。
使用蘋果手機的公鑰A來驗證的。
2.3:描述文件:
設備id列表
appid,應用列表
權(quán)限文件
證書在描述文件里面。
2.4:Mac電腦拿到證書、描述文件。
打包生成ipa包。
用私鑰M對可執(zhí)行文件進行簽名。app的簽名。
把證書放到app中。
打包的時候,會把描述文件放到app中,描述文件包括了證書,應用列表
2.5:把app安裝到ios系統(tǒng)中。
p12就是私鑰M,
1:用公鑰A對證書進行解析,解析出公鑰M
iOS上蘋果的公鑰把provisioning profile文件解密了就驗證了這個app是經(jīng)過蘋果官方認證的,
2:用公鑰M對app進行驗證。
也就驗證了這個app來自于你這個開發(fā)者。不是別人冒充的。
3:描述文件限制:provisoning profile
現(xiàn)在有證書了,就可以安裝所有的設備,那就不用上傳到appStore。
所以蘋果進行了限制,
1:限制設備
2: 具體對某一個app進行簽名,對推送,進行了限制。
3:entitlements(授權(quán)文件)
描述文件: 里面包含了授權(quán)文件和證書簽名、
4:查看描述文件的信息
security cms -D -i ****.mobileprovision
用來查找provision profile文件地址
/Users/XXX/Library/MobileDevice/Provisioning Profiles
xxx是文件名字
Entitlements? 權(quán)限
application-identifier:bundleid
get-task-allow:是否允許調(diào)試
ExpirationDate:過期時間
ProvisionedDevices:注冊的設備
xxx.mobileprovision?文件是一個plist文件
AppIDName
CreditDis
ApplicationIdentifierPrefix
5876MU3PLA
CreationDate
2019-10-29T00:46:09Z
Platform
iOS
IsXcodeManaged
DeveloperCertificates
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
Entitlements
application-identifier
5876MU3PLA.com.cebbank.xyk
keychain-access-groups
5876MU3PLA.*
get-task-allow
com.apple.developer.team-identifier
5876MU3PLA
aps-environment
development
ExpirationDate
2020-10-28T00:46:09Z
Name
yghsh_dev_20191029
ProvisionedDevices
5257bcb8938e4e6dbbe908622450918a5bdc61f9
25ca953841c6c3f97e1d916f44f76d796fa058a9
7e0da1c205d9a58c868266d99f2c8a17d4f65642
43e3673c83a1056d1463f7e902ecaded99c0e8db
e7447c0751a0ef7c8c84f7e72c0967fc064f8b21
76593166cd370a9e975ed3005783fa3690fb97eb
976dd4e3ec1931ca0d486fbf2dc6820bd369e891
bba882d248f21a6df38604b89122e63aa0bb2a0b
ec54ec221d5a62da45052433f92a5aafbdd9fa58
066eb234a8b151b0a1fa0ffec022c34665213b07
fdcf5eff39336079294dc39e19249b714274c4d9
0ccb4fb26f7c4dc5577dd1a4b9657390b17b0112
8023c4f949eead298073482341a0df95f1b32a7e
551f3b95cfed25879bce15577d29964b309a0d3d
456dd8ab4e8d9810f37990275ee49b6c6395603f
f8d5971a8f8cade0bb50056516d05d926665e954
c2320e6c1afea74cc3299da09534430fdd43fbba
14113f41ba942973e3d1febd7b0157f4d899ebd4
3edd2ed0cfc37e14310b32aa28b56a511fa7b4ad
40cf9e14609c8de2a4ec9911ac885490ab6f8955
bf12dfaa8369720db79800dce2b0d1bdf1cea1b7
23c219ec1549539885431116d114ed69a366efb9
4eec9a9c4a326e13e88e5c2af8ecf8202aa317ee
5329d4406834956dceb7ebd86f4fc317a695f730
ae2417fd5ff7713a032990e941d9e0c7aa95a149
f46cd8714b3663379a76c418f3a5b50b3caab8b7
3dcdc6a109f754773703d2d7d85ee00d7a3ef56a
9250f2f39cc7da26fd8ec65ee910ca9c0f907514
6bbad9e1591205d92a8620c58208dbc5839ccf18
f0a299ffdbb19f1e8ed5088f45743ee21f6c9e96
458c9b1a6909245e39c9f7bcface72bb3d1d39d0
44ad18e054338547898c748da0e169dc9f1c1c0f
d1543a75aa8f622a0f6e09e0c52a7017627a8c03
e16ef4e8b06878054584000a8b9b02df6745c3f5
04d9ed9cb1eb6931305b42299b3cd54b2dc4835d
5a7b9823fc4b7219343167f9aef1fefcc4668189
23387ab926ec9e0e98198d015ea53a8362cfdee5
6bcfeab3efaf8abf6d94faea7c087a99c92f6a16
aaa1a4e15a8a4134dd14155321b8e8f02fba3ffa
2a2cdb96bdd9223b88bd24f051db743f27cda082
ea07b7635387b0aa91f52f25e27c91e611719c3d
5c7b2d58973f22aceedfb08c815ed40171bb3a0f
ab86138f55e2e7454fb60af7f9d7300d1c4aa19a
9319ce7d8d7454708eaa3ec36e6e5d0f64c2d5e6
e835f7ded888bdcc131b13be90898ea2552e8b0c
e1ca8bfcf4f8223f901d2a53e1b16806e6219100
a247c65267217583ecb3c0113eb69413bcae4061
35bba4f8ca9f116b6f0ea7297a2597502606cbd9
cacee5eb9ba753203b367765f73a55d0c10705b3
aea988226969f7dc0ebdd2873d3a0a9870b6d2ea
a602fbd7d3adc4a3ba90b95936f350f1850ca748
ac83a77644b7c5d5c3ce78256a5b13f84bb47ef2
86a95f3b4dbf8339b3a2c5441680adc1a7e91371
853d41c50b39c3bddff96347ca4d04664601e24f
0ee2ac1da3ebe717a4aad48eda94ee7bd1895325
1a719ca3a81c8c06e87738c525cb2362897d1aef
5281a7049193939a001cb4d4d322cd0d090e8389
41afb7542e698deccca1a8c133c60f2bf6e926b6
6904333738e8343b7c00a381ed3483d65797340b
98d6368b6c261914759ccea78c618cb1bbb090fb
00008020-001920582130003A
6ccc35714ae1ef652b3dfd9b2208665b746c1d37
4ba06a53801cf244b0f02be3cdb5e9bd3ea5182d
98969ca6f2b59853f64ac06caf8690f5da07067b
00008020-001C646834D8002E
00008020-000838110E82002E
0694b66582a715f2b86a8e406c5a331dadecbe17
1f6a4788b00d9689fb6d3cd4412ddfd746b588c3
ec07b36ad5e1d92aa1b9bc091a17bd1587fec877
ddd1ae9addf883966df082eecc00babdd1119389
fa43b4b1b37bcb37b6b9f25bf12818b182337a72
1f81b591571baf2777049eacd419477553500520
00008020-000E19620A38002E
00008020-001A54640CF8002E
00008020-001A54C80E52002E
e99c115fbc62fc087b5d1da9c05734a3686858eb
e864964d45d686fecd93379fee8aefe18ccd561e
d18613efb0b8aa36863c8702229184c374515204
TeamIdentifier
5876MU3PLA
TeamName
China Everbright Bank CO., LTD Credit Card Center
TimeToLive
365
UUID
3c4c436e-1320-41b4-819c-7bf90d0c38b8
Version
1
View Code
5:.app里面的簽名信息
codesign -d -vv **.app
1:CodeResources:是資源簽名
2:應用簽名在macho文件中
6:簽名流程
雙向簽名流程
1.在Mac上生成一對公私鑰,分別為公鑰L,私鑰L
2.Apple 官方有自己固定的一對公鑰和私鑰,私鑰A存在Apple后臺,公鑰A內(nèi)置在iOS設備
3.把公鑰L 上傳Apple后臺,Apple后臺用私鑰A對公鑰L進行簽名,將得到的簽名+公鑰L打包起來,稱為證書
4.在蘋果后臺申請AppID,配置好設備IDs, Entitlements,這些額外信息+3中的證書組成的數(shù)據(jù)用私鑰A簽名,最后證書+額外信息+簽名組成 Provisioning Profile 文件,下載到Mac本地
5.開發(fā)時,編譯完一個app后,用本地私鑰L對app進行簽名,然后把4中的Provisioning Profile文件打包進App里,文件名為embedded.mobileprovision,安裝到手機上。
6.安裝時,iOS設備內(nèi)置的公鑰A對embedded.mobileprovision的數(shù)字簽名進行驗證,同時對里面的證書的簽名也會驗證(用來驗證是蘋果官方授權(quán)的)
7.如果6中驗證通過,確保了embedded.mobileprovision的數(shù)據(jù)是蘋果授權(quán)后,再取出里面數(shù)據(jù)做各種驗證,包括公鑰L對app簽名進行驗證,驗證設備ID,AppID,權(quán)限開關(guān)。(用來驗證app是這個公司官方開發(fā)的app。)
二:重新簽名
1:獲取ipa包
助手,
越獄手機中copy,
iTurns:12.6.3版本。
2: ? 查看簽名和證書
2.1:查看簽名信息Xcode用codesign簽名
codesign -d -vv **.app
2.2:查看證書
security find-identity -v -p codesigning
2.3:查看有沒有加密,沒有加密可以操作
在***.app文件夾中執(zhí)行,, ***是包的名字,
2.3.1:查看macho文件
otool -l ***
2.3.2:管道輸出 macho文件
otool -l *** > ~/Desktop/123.txt
cryptid:
0:代表沒有加密
非0:代表加密,加密的方式
2.3.3:通過管道符 篩選
otool -l *** | grep crypt
3: 手動重新簽名
3.1:把plugins插件刪除,把watch刪除
3.2:對framework 簽名
codesign -fs "iPhone Developer: Jiaqi Wang (ML39CFE2C8)" ***.frmework
FMDB.framework: replacing existing signature? 重新簽名成功
3.3:描述文件
1:把描述文件拷貝到***.app中
2:.plist把bundleid修改
3:用權(quán)限文件給app簽名
codesign -fs "iPhone Developer: Jiaqi Wang (ML39CFE2C8)" —no-strict —entitlements=entitlements.plist ***.app
4:對app進行打包
Zip -ry ***.ipa payload
5:? 信任描述文件(可以用xcode替換)
4:使用Xcode進行簽名(OK)
4.1:刪除插件,watch文件夾
4.2:修改bundleid,plist文件中的
4.3:對framework進行簽名
4.4:? 用Xcode對entiltlement安裝,對app包簽名,
5:shell腳本執(zhí)行文件
5.1:zsh 123.sh
5.2:? bash 123.sh
5.3:? source 123.sh ? 影響當前的環(huán)境,
5.4:? ./ 123.sh
注意:查看shells命令,得到mac電腦的命令
cd /private/etc
open .
cat shells
三:用戶、組、權(quán)限、文件
linux unix windows? Macos
多任務、多用戶
1:文件組合權(quán)限
2:修改權(quán)限? 寫比較嚴格
四:腳本簽名
# ${SRCROOT} 它是工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"#資源文件夾,我們提前在工程目錄下新建一個APP文件夾,里面放ipa包
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文件上執(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"];
thenfor FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do#簽名/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"done
fi
View Code
1:創(chuàng)建一個項目
2:創(chuàng)建一個runscript,
添加命令
${SRCROOT}/signApp.sh
3:添加命令行代碼于(signApp.sh)
注意
1、申請開發(fā)者證書:
將原來快要過期或者已經(jīng)過期的測試證書、發(fā)布證書、Provision Profile文件等跟該AppID相關(guān)的證書和PP文件revoke,即刪除掉。
注:刪除證書和描述文件對已經(jīng)上線的app沒有影響。
2:別的電腦使用證書:
經(jīng)過簽名的的證書(Certificates)需要在別的電腦上使用的時候,需要將p12(私鑰-申請證書的電腦)文件和證書一起傳到別的電腦使用,這個時候就需要導出p12文件
引用
總結(jié)
以上是生活随笔為你收集整理的ios重签名shell脚本_03:双层签名和重签名流程以及shell脚本重签名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中左对齐问题_[Python
- 下一篇: 马化腾对C语言的重视