Fastlane證書管理(二):match

1. 前言

match這個Tool的作用可以分為兩步

  1. 獲取合適的cert和profile
  2. 將獲取的cert和profile安裝到本機(jī)

其簡單流程如下圖所示


  • 首先,從:git_url指定的git倉庫中獲取cert和profile痕届,如果沒有弧岳,則從AppleID賬號中獲取寝姿。
    當(dāng)從AppleID賬號中獲取cert時嗡综,即使你的AppleID賬號中有創(chuàng)建好的簽名證書簇捍,match也只會嘗試去創(chuàng)建一個新的的簽名證書只壳,如果你的AppleID賬號中簽名證書的數(shù)目已達(dá)到了2個,則會創(chuàng)建失敗暑塑,然后match異常退出吼句;
    當(dāng)從AppleID賬號中獲取profile時,會強(qiáng)制創(chuàng)建一個新的來使用事格。具體過程可查看上一節(jié)cert和sigh惕艳。
  • match的最終目的就是把cert和profile安裝到本機(jī)
    cert被導(dǎo)入到鑰匙鏈中
    profile被安裝到xcode中

2. 內(nèi)部流程

macth特別適合在一個團(tuán)隊里面使用,在使用match時驹愚,一般會先使用match創(chuàng)建一套可使用的cert和profile上傳到git倉庫中远搪,然后共享這個git倉庫給團(tuán)隊的其他成員,這樣就可以一次創(chuàng)建逢捺,多次使用了谁鳍。另外,macth提供了一個只讀模式劫瞳,可以防止你修改AppleID賬號中或git倉庫中的cert和profile倘潜。

2.1. 只讀模式

當(dāng):readonly的值是true時,match不會訪問AppleID賬號志于,只會從git倉庫獲取cert和profile涮因,并且不會修改git倉庫。在只讀模式中伺绽,:force必須是false养泡,否則嗜湃,程序異常退出。在只讀模式中澜掩,:force_for_new_devices不會生效净蚤。

  1. 從倉庫克隆cert和profile
    通過:git_url指定git倉庫的地址,默認(rèn)情況是克隆master分支输硝,可通過:git_branch指定分支今瀑。如果在同一個倉庫中管理多個team,可使用不同的分支來存儲不同的team点把。
    克隆完畢之后橘荠,整個庫會被存儲在一個臨時地址中,庫的文件結(jié)構(gòu)如下圖所示
-certs
  -enterprise
    -#{cert_id}.cer
    -#{cert_id}.p12

  -development
    -#{cert_id}.cer
    -#{cert_id}.p12

  -distribution
    -#{cert_id}.cer
    -#{cert_id}.p12

-profiles
  -enterprise
    -InHouse_#{bundleID}.mobileprovision

  -appstore
    -AppStore_#{bundleID}.mobileprovision

  -adhoc
    -AdHoc_#{bundleID}.mobileprovision

  -development
    -Development_#{bundleID}.mobileprovision

上述文件結(jié)構(gòu)列出了certs/profiles/目錄中所有可能的子目錄郎逃,具體使用哪個子目錄哥童,則是由:type指定,比如在使用企業(yè)賬號時褒翰,且:type等于enterprise贮懈,則certs目錄下會有一個enterprise子文件夾。
cert和profile文件的命名必須按照上述格式优训,否則match會識別不出來朵你。

:type與子目錄名對照表

type certs/下子目錄名 profiles/下子目錄名
enterprise enterprise enterprise
appstore distribution appstore
adhoc distribution adhoc
development development development

倉庫中存儲的cert和profile文件都被OpenSSL加密過,所以克隆下來之后的第一件事就是解密揣非,這時match需要一個密碼用來解密抡医,可以通過環(huán)境變量MATCH_PASSWORD來指定,如果沒有指定早敬,則match會嘗試去鑰匙鏈的密碼列表中尋找名稱為match_#{:git_url}的鑰匙串項(xiàng)忌傻,如果仍然沒有,則需要用戶手動輸入搞监。在CI環(huán)境中水孩,最好事先使用環(huán)境變量MATCH_PASSWORD設(shè)置好。

match使用類似下列終端命令的代碼來加解密

#加密
openssl aes-256-cbc -k "<password>" -in "<fileYouWantToEncryptPath>" -out "<encryptedFilePath>" -a -e
#解密
openssl aes-256-cbc -k "<password>" -in "<fileYouWantToDecryptPath>" -out "<decryptedFilePath>" -a -d

如果cert和profile已創(chuàng)建好琐驴,可以使用上述命令加密下載的cert和profile俘种,然后上傳到git倉庫。

  1. 獲取bundleIDs
    通過:app_identifier來指定bundleID棍矛,如果有多個bundleID安疗,可以通過逗號分隔。
    git倉庫的同一個分支中够委,可以存放多個app的profile荐类,因?yàn)閜rofile文件名中帶有bundleID,所以可以通過文件名來區(qū)分不同的app的profile茁帽。

  2. 從倉庫獲取cert
    首先玉罐,根據(jù):type指定的類型屈嗤,假設(shè)其值為enterprise,則match遍歷倉庫的/certs/enterprise/目錄下的所有文件吊输,將文件名符合*.cer格式的最后一個當(dāng)做簽名證書饶号,將文件名符合*.p12格式的最后一個當(dāng)做其對應(yīng)私鑰。
    3.1 如果簽名證書和其私鑰都存在季蚂,則將簽名證書的文件名去掉擴(kuò)展名茫船,剩余部分作為此證書的id。
    3.2 如果簽名證書或其私鑰不存在扭屁,則異常退出算谈。
    (其詳細(xì)流程可查看本文的第3小節(jié))

  3. 安裝證書到鑰匙鏈
    match使用如下命令將[步驟3]中獲取的證書和其私鑰分別安裝到鑰匙鏈中

# certificate_path 表示要導(dǎo)入證書的路徑
# keychain_path 表示鑰匙鏈的路徑,一般是`~/Library/Keychains/login.keychain-db`
# certificate_password 表示證書的密碼料滥,默認(rèn)是空字符串然眼,通過`cert`創(chuàng)建的證書的密碼為空
# -T usr/bin/codesign 表示使用`usr/bin/codesign`訪問這個證書的時候不需要授權(quán),也就是不需要輸入鑰匙鏈的密碼葵腹,使用xcodebuild打包app的使用會使用這個命令
security import certificate_path -k keychain_path -P certificate_password -T /usr/bin/codesign -T /usr/bin/security
  1. 從倉庫獲取profile
    和[步驟3]類似高每,首先,根據(jù):type指定的類型践宴,假設(shè)其值為enterprise鲸匿,則match遍歷倉庫的/profiles/enterprise/目錄下的所有文件,將文件名符合InHouse_#{bundleID}.mobileprovision格式的最后一個作為要使用的profile浴井。
    5.1 profile存在晒骇,則執(zhí)行[步驟6]
    5.2 profile不存在,則異常退出磺浙。
    (其詳細(xì)流程可查看本文的第4小節(jié))

  2. 安裝profile到xcode
    將[步驟5]中獲取的profile文件復(fù)制到~/Library/MobileDevice/Provisioning Profiles/目錄下,文件名為#{uuid}.mobileprovision徒坡,其中uuid是profile的uuid

  3. 然后正常退出

注意撕氧,在獲取cert和其私鑰時,match只是粗略的通過文件擴(kuò)展名來做篩選喇完,并沒有驗(yàn)證證書和其私鑰是否是一一對應(yīng)的伦泥,所以不要把兩套cert放在同一個子目錄下。同理锦溪,在獲取profile時不脯,也沒有驗(yàn)證cert和profile中關(guān)聯(lián)的cert是否是同一個簽名證書。所以可能出現(xiàn)一種情況刻诊,macth執(zhí)行成功防楷,但是app打包不成功。當(dāng)然则涯,如果你沒有手動修改git倉庫复局,只通過match來創(chuàng)建和更新冲簿,則不會出現(xiàn)這種情況。

2.2 非只讀模式

當(dāng):readonly的值是false時亿昏,如果git倉庫中沒有找到可用的cert和profile峦剔,則match會從AppleID賬號中創(chuàng)建新的。

  1. 從倉庫克隆cert和profile

  2. 登錄AppleID和選擇teamID

  3. 檢測type
    當(dāng):type的值是enterprise角钩,但你使用的AppleID賬號不是一個企業(yè)賬號時吝沫,異常退出。

  4. 獲取bundleIDs

  5. 檢測bundleIDs的可用性
    遍歷bundleIDs递礼,如果在AppleID賬號中不存在對應(yīng)App ID野舶,則異常退出,只要有一個不存在就會異常退出宰衙。

  6. 獲取cert
    首先嘗試從git倉庫獲取cert平道,其具體流程和[2.1節(jié)的步驟3]完全一樣,如果git倉庫中沒有供炼,則嘗試從AppleID賬號中創(chuàng)建一個新的簽名證書一屋。
    為了實(shí)現(xiàn)創(chuàng)建新的證書這一功能,match調(diào)用了cert這個Tool袋哼,并設(shè)置cert:force參數(shù)的值為true來強(qiáng)制創(chuàng)建冀墨,而不管本地鑰匙鏈中是否存在cert。如果創(chuàng)建成功涛贯,則下載創(chuàng)建的cert和其對應(yīng)私鑰到git倉庫的子目錄certs/cert_type中诽嘉。
    (調(diào)用cert的詳細(xì)流程可查看cert和sigh,本步驟的詳細(xì)流程可查看本文的第3小節(jié))

  7. 安裝cert到鑰匙鏈

  8. 檢測cert可用性
    檢測在[步驟6]中獲取的cert是否存在于AppleID賬號中弟翘,具體而言就是比較cert和AppleID賬號中獲取的cert的唯一標(biāo)識符是否一致虫腋。
    從步驟6可知,有兩個途徑獲取cert稀余,git倉庫和AppleID賬號悦冀。從AppID賬號中下載的cert肯定是沒問題的,這一步主要是驗(yàn)證從git倉庫中得到的cert的唯一標(biāo)識符的可用性睛琳。上文中有提到盒蟆,在git倉庫中獲取的cert的唯一標(biāo)識符就是這個cert去掉了擴(kuò)展名之后的文件名。

  9. 獲取profile
    和[步驟6]類似师骗,首先嘗試從git倉庫獲取profile历等,如果git倉庫中沒有,則嘗試從AppleID賬號中創(chuàng)建一個新的profile辟癌。
    假設(shè):type的值為enterprise寒屯,從git倉庫中獲取profile的具體流程是,遍歷倉庫中/profiles/enterprise/目錄下的所有文件名符合InHouse_#{bundleID}.mobileprovision格式的profile文件愿待,如果這個profile存在于AppleID賬號中浩螺,則返回這個profile靴患。
    為了實(shí)現(xiàn)創(chuàng)建新的profile這一功能,match調(diào)用了sigh這個Tool要出,并設(shè)置sigh:force參數(shù)的值為true來強(qiáng)制創(chuàng)建鸳君,而不管AppleID賬號中是否已存在profile。同時患蹂,也指定了sigh:cert_id參數(shù)的值為[步驟6]中獲取的cert的唯一標(biāo)識符或颊。
    (調(diào)用sigh的詳細(xì)流程可查看cert和sigh,本步驟的詳細(xì)流程可查看本文的第4小節(jié))

  10. 安裝profile到xcode

  11. 提交cert和profile到倉庫
    如果在[步驟6]創(chuàng)建了新的cert或在[步驟9]中創(chuàng)建新的profile传于,則需要將這些新創(chuàng)建的文件添加到倉庫囱挑,并推送的遠(yuǎn)程倉庫中。

3. 獲取cert

下圖是獲取cert的詳細(xì)執(zhí)行流程


3. 獲取profile

下圖是獲取profile的詳細(xì)執(zhí)行流程


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沼溜,一起剝皮案震驚了整個濱河市平挑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌系草,老刑警劉巖通熄,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異找都,居然都是意外死亡唇辨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門能耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏枚,“玉大人,你說我怎么就攤上這事晓猛《龇” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵鞍帝,是天一觀的道長诫睬。 經(jīng)常有香客問我,道長帕涌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任续徽,我火速辦了婚禮蚓曼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钦扭。我一直安慰自己纫版,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布客情。 她就那樣靜靜地躺著其弊,像睡著了一般癞己。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梭伐,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天痹雅,我揣著相機(jī)與錄音,去河邊找鬼糊识。 笑死绩社,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赂苗。 我是一名探鬼主播愉耙,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拌滋!你這毒婦竟也來了朴沿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤败砂,失蹤者是張志新(化名)和其女友劉穎赌渣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吠卷,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锡垄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祭隔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片货岭。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疾渴,靈堂內(nèi)的尸體忽然破棺而出千贯,到底是詐尸還是另有隱情,我是刑警寧澤搞坝,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布搔谴,位于F島的核電站,受9級特大地震影響桩撮,放射性物質(zhì)發(fā)生泄漏敦第。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一店量、第九天 我趴在偏房一處隱蔽的房頂上張望芜果。 院中可真熱鬧,春花似錦融师、人聲如沸右钾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舀射。三九已至窘茁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脆烟,已是汗流浹背山林。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浩淘,地道東北人捌朴。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像张抄,于是被迫代替她去往敵國和親砂蔽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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

  • 1. 前言 cert、sigh和match是Fastlane中的三個Tool极谊,他們都是與證書相關(guān)的工具诡右。cert的...
    wangzzzzz閱讀 8,161評論 3 18
  • fastlane運(yùn)行所需要的環(huán)境: OS X 10.9以上 Ruby 2.0 以上 Xcode 擁有一個開發(fā)者賬號...
    阿姣_0405閱讀 2,947評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)轻猖,斷路器帆吻,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 前言 團(tuán)隊開發(fā)中,經(jīng)常會遇到新成員加入或者證書及配置文件的變更,此時往往會造成一堆證書/pp文件失效問題,故我們可...
    肥貓記閱讀 7,458評論 0 10
  • 引言關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Prof...
    molake閱讀 48,194評論 7 62