針對蘋果證書申請簽名記一下自己的看法胰挑,有錯誤或遺漏的地方請指出徽鼎。
一.目的
蘋果為什么要采取如此復(fù)雜的證書簽名機制
? ? ? ?對盜版軟件做到一定的控制腥沽,大部分主流操作系統(tǒng)(Windows/Mac/Linux)對運行在自己平臺上的軟件都得不到很好的管理谦炒,隨便哪里下載都能用或悲。蘋果希望對自己的平臺有一定的控制權(quán),在ios系統(tǒng)上運行的軟件都需要得到自己的允許怪与。蘋果最近對使用熱更新的部分軟件給予了警告夺刑,說明蘋果在控制權(quán)方面是絲毫不想讓步的。(同意你的軟件安裝在ios系統(tǒng)分别,而且你的每次更新或者改變遍愿,人家也要知道,也要人家同意耘斩。)
二.概念了解
對稱加密:
? ? ?對原始的可逆變換沼填。如 abcd變成defg,字母表順移三位括授,密鑰就是3(當(dāng)然這是簡單舉例坞笙,實際應(yīng)用中進行了相當(dāng)復(fù)雜的位運算),通訊兩端知道密鑰3就可以進行加解密荚虚。優(yōu)點加解密速度快薛夜,對服務(wù)器壓力小。缺點在于其中一端制定了加密密鑰版述,怎么傳送到另一端梯澜。只要經(jīng)過網(wǎng)絡(luò)就有可能被攔截,攻擊者知道了密鑰院水,你的加密就毫無意義腊徙。是不是要對密鑰再一次加密,那生成密鑰還是存在上述問題檬某,除非你騎馬送過去撬腾。怎么解決,往下看恢恼。
非對稱加密(基于公鑰的加密):
? ? ?生成兩份密鑰民傻,分別是公鑰和私鑰,公鑰加密私鑰解密,私鑰加密公鑰揭秘(實際應(yīng)用中公鑰用來加密漓踢,私鑰多用來簽名認證)牵署,私鑰自己保存,公鑰散發(fā)出去喧半,解決了對稱加密中密鑰的安全傳輸問題奴迅。
數(shù)字簽名:
? ? ? 在要傳送的數(shù)據(jù)后面加上一段信息(給數(shù)據(jù)簽名),證明信息沒有被修改過挺据。簡要描述:對數(shù)據(jù)做hash計算取具,得到一個hash值,這個過程不可逆(不能通過hash值得到原數(shù)據(jù)扁耐,代表算法MD5)暇检。將簽名和數(shù)據(jù)一起加密發(fā)送出去,對方接到數(shù)據(jù)后用自己的的密鑰解開婉称,拿出數(shù)據(jù)和簽名(上文中提到的hash值)块仆,將數(shù)據(jù)用同樣的hash算法處理,若得到同樣的簽名王暗。則證明數(shù)據(jù)沒有被修改過悔据,反正則被修改,主要用非對稱加密的方式來實現(xiàn)俗壹。這里有個前提蜜暑,hash算法要保證不同的內(nèi)容一定會得到不同的hash值。
三.簽名機制(圖文流程)
有了上面的概念我們來一步步學(xué)習(xí)蘋果是如何用簽名加密來實現(xiàn)對ios控制的
?問題一.蘋果要讓發(fā)布在appStore的App都得到自己官方的認證許可
? ? ? 簡單解決思路:蘋果官方生成一對公私鑰策肝,私鑰由蘋果后臺保存,公鑰內(nèi)置在每臺ios系統(tǒng)內(nèi)隐绵。在上傳app到appstore時之众,蘋果對每個app都用私鑰數(shù)字簽名。iOS系統(tǒng)裝入app的時候會用公鑰解密驗證依许,這樣就能保證app是蘋果同意安裝的(假設(shè)私鑰是不會外泄的棺禾,只有蘋果才知道,不然這事沒發(fā)往下說了峭跳。當(dāng)然也不可能外泄)膘婶。其實上面的思路已能夠解決讓蘋果很大程度上控制app和ios系統(tǒng)。
問題二.如何讓開發(fā)者使用真機調(diào)試
? ? ? ?以上的解決思路確實能保證從appstore下載裝入iOS系統(tǒng)的app是蘋果官方允許的蛀醉,但對于開發(fā)者來說要用真機調(diào)試啊悬襟,不能用模擬器開發(fā)完直接上appstore吧。這時候怎么把app裝入真機ios系統(tǒng)拯刁,如何對調(diào)試過程進行控制脊岳。
? ? ? 解決思路:在app每次真機編譯完成之后傳送到蘋果后臺,后臺私鑰對其進行簽名,然后裝機調(diào)試割捅。這確實是一個辦法奶躯,但頻繁的調(diào)試每次都要后臺交互簽名。單就網(wǎng)絡(luò)問題蘋果和開發(fā)者都不會接受的亿驾。
? ? ? 所以蘋果給出了現(xiàn)行的方法嘹黔,證書簽名(雙層簽名方法)。以上比較好理解莫瞬,以下會分條說明并帶著截圖儡蔓。
? 1.從本地申請一對密鑰,見圖1圖2乏悄。你可以看到本地鑰匙串已經(jīng)生成一對密鑰(下文簡稱公鑰P浙值,私鑰P,圖3)檩小,本地也生成了一個certSigningRequest(證書簽名請求)文件开呐,暫且理解為本地生成的公鑰P文件。
? ?2.證書請求文件已準備好了规求,還是通過最基本流程截圖展示證書請求過程筐付,當(dāng)然后面也會解釋原理。
? ? 進入蘋果開發(fā)者網(wǎng)站阻肿,注冊了付費的開發(fā)者賬號才能看到如下頁面
選擇申請一個證書瓦戚,下以開發(fā)證書為例
?選擇繼續(xù),這里需要上傳我們本地生成的公鑰P文件
選擇downlaod丛塌,下載證書文件到本地较解。也可以回到圖5處下載生成的證書文件。
如下圖證書文件
? 至此我們已經(jīng)把證書請求下來了赴邻。解釋一下此過程蘋果做了什么印衔,為什么說控制了開發(fā)者的安裝行為
? ? ?接上 3. ? 見圖7圖8 我們把我們本地生成的公鑰P傳到了蘋果后臺,蘋果后臺有一對固定密鑰姥敛,這同上面appstore提到的簽名密鑰一樣(下文簡稱公鑰Q奸焙,私鑰Q),蘋果用私鑰Q對我們上傳的公鑰P進行了加密數(shù)字簽名彤敛。生成了如圖9所示的證書文件与帆。簡單理解這個文件包含了公鑰P及私鑰Q對其的數(shù)字簽名。
? ? ? 4.我們把下載的證書雙擊安裝然后配置到xcdoe里邊如圖10墨榄,在我們開發(fā)時玄糟,編譯完一個app時本地的私鑰P會對此app進行數(shù)字簽名,同時會把上面配置的證書文件一起打包進app里渠概,過程見圖茶凳。便可裝到手機上(其實大部分還是不可以的嫂拴,因為描述文件問題,后面解釋)贮喧。通過以下的原理解釋你先明白蘋果怎么通過證書控制調(diào)試安裝行為筒狠。
? ? ? 原理解釋:a.在安裝的時候,iOS系統(tǒng)取出app 內(nèi)的證書箱沦,通過ios系統(tǒng)內(nèi)置的公鑰Q(上文提到過的內(nèi)置公鑰)去驗證證書的數(shù)字簽名是否正確辩恼,在這一步驗證什么呢赴精,驗證了證書是沒有被修改過的融蹂,也就保證了內(nèi)含的公鑰P是蘋果認證過的。b. 然后再用公鑰P對app(私鑰P簽名過的)進行驗證肚逸,這個過程就間接驗證了此安裝行為是否經(jīng)過蘋果的允許寒跳。這里可能有點繞聘萨,對不太理解的小伙伴在補充一下。我們通過內(nèi)置私鑰Q驗證了公鑰的P的可靠性(這跟appstrore驗證原理相同)童太,如此一來只要可以被公鑰P認證通過的app也就是安全的米辐。這樣的app就只能是私鑰P簽名過的了(因為它們是一對么,我是安全的书释,你加密簽名過的也就是安全的了)翘贮。
問題二.如何控制開發(fā)者權(quán)限的濫用
? ? ?至此蘋果解決了開發(fā)者的問題,給予了開發(fā)者通過證書真機安裝App的權(quán)限爆惧。但是問題貌似又回到了原點狸页,你開發(fā)者把這樣的app丟出去,大家又可以肆無忌憚下載了扯再,還繞過了appstrore芍耘。又可能被濫用了,瞎搞了一通熄阻,是不是齿穗。人蘋果爸爸手段多得很,來兩個限制饺律。
?? ? ? ? 1·.讓簽名只能針對某個(有人說通配符,應(yīng)該是某些跺株,這些細節(jié)先忽略)具體的app复濒,意思就是你要在后臺注冊你的AppID。
? ? ? 2乒省,對可以安裝設(shè)備數(shù)量也進行限制100個(企業(yè)證書巧颈?細節(jié)先不要在意,后面解釋)袖扛,要把這100個設(shè)備的設(shè)備號也要后臺注冊砸泛。
? ? ? ?有了上面兩條十籍,開發(fā)者也逃不出蘋果的手心了。怎么解決唇礁,照常理勾栗,在生成證書文件的時候把這兩個限制條件一塊加進去,把本地公鑰P盏筐,注冊的appID和設(shè)備號一塊簽名加密围俘,生成一個證書下載供開發(fā)者使用,可能變得有點復(fù)雜琢融。如果只有這兩項限制是完全行可行的界牡。但是ApplePay/push/iCould這些蘋果都想控制,你也需要申請漾抬,人家還要把信息加在里證書里邊宿亡。著實不好擴展,于是蘋果將它們分開纳令,搞了另一個東西叫Provisioning Profile(描述文件)挽荠,就是把你的證書,注冊的appId和設(shè)備ID搞一塊在用私鑰Q進行簽名泊碑。坤按,搞完之后出現(xiàn)了一個mobileprovision這樣的文件,我們下載到本地馒过。以下圖文展示
? ?注冊appid臭脓,下邊有選項里有可以使用通配符
注冊設(shè)備號,可以添加100個腹忽,每年可更新
給描述文件添加信息 此處添加appID
? 選擇證書
選擇設(shè)備
? ? 以上我們已經(jīng)準備好描述文件来累,蘋果正是用它來控制開發(fā)者對app的濫用。?
? ? ?如此一來又會多出兩條步驟窘奏,希望你沒有暈嘹锁,解釋一下它是怎么工作的。首先配好證書着裹,把你下載的描述文件也雙擊安裝领猾,在xcode里也把它配好見圖19。其他過程不變骇扇,在編譯本地簽完名之后會把這個描述文件也一塊打包進app摔竿。安裝的時候通過系統(tǒng)內(nèi)置的公鑰Q,去驗證mobileprovision數(shù)字簽名少孝,當(dāng)然證書也會在驗一遍继低。確保mobileprovision注冊的信息都是蘋果授權(quán)的。然后取出mobileprovision的數(shù)據(jù)列表做各種匹配驗證稍走,包括用上面提到的用公鑰P驗證app簽名袁翁,驗證當(dāng)前設(shè)備的設(shè)備ID是否在此ID列表上柴底,appid是否對應(yīng)的上,各種權(quán)限開關(guān)等等粱胜。
其他問題解釋:
企業(yè)證書:此類證書是不需要配置設(shè)備號ID的柄驻,數(shù)量不限。但是不能發(fā)不到appstore
p12文件:上文我們提到了本地的公私鑰年柠,它就是用我這臺mac生成的凿歼,那如果其他Mac也要調(diào)試,對app簽名的話冗恨,我們就導(dǎo)出私鑰(p12)文件給別臺mac答憔,把證書和描述文件一塊拷貝過去,搞定