App 上架 AppStore和证书的各种区别
App 上架 AppStore 需要經(jīng)過蘋果的審核,違規(guī) App 不能上架。蘋果 iOS 系統(tǒng)有一套完善的加密方案,在不越獄破解的情況下,非 AppStore 下載的 App 需要證書簽名,才能在 iOS 上運行。證書需要向蘋果申請,有幾類證書。免費證書。用于入門級開發(fā)者,可以用 Xcode 真機調(diào)試,不能上架 AppStore。個人開發(fā)者證書。需要收費,支持個人真機調(diào)試,可以將上架 AppStore。公司證書。需要收費,支持多人協(xié)作開發(fā),可以將上架 AppStore。企業(yè)證書。需要收費,支持企業(yè)自己發(fā)布 App, 不可以上架到 AppStore。某些 App 可以通過 Safari 下載,信任證書后正常使用。這種 App 就是用了企業(yè)證書。為什么蘋果公司允許企業(yè)證書呢?顧名思義,企業(yè)證書是在企業(yè)內(nèi)部使用的。正常情況下,企業(yè)證書有如下用途。某些 App 只是企業(yè)內(nèi)部使用,不方便上架 AppStore。比如企業(yè)內(nèi)部有個 OA 系統(tǒng),用于員工打卡、請假、收發(fā)郵件。企業(yè)為 OA 系統(tǒng)開發(fā)了 iOS 的 App。這個 App 對企業(yè)內(nèi)部員工很有用,企業(yè)外用戶完全無用。因此這個 OA 系統(tǒng) App 不方便上架 AppStore,就算想上架,也不能審核通過。某些 App 雖然可上架 AppStore 外發(fā),但新版本還在開發(fā)測試過程中。使用企業(yè)證書簽名 App,放到網(wǎng)上,員工打開網(wǎng)頁就可下載,方便測試。在開發(fā)測試期間,往往一天好幾次構(gòu)建新安裝包,內(nèi)部員工(特別是測試人員)在網(wǎng)上可以下載到最新的測試包。------------------------假如通過企業(yè)證書,將一些內(nèi)容違規(guī)(比如色情、政策、版權(quán)、隱私等)不能上架的 App 外發(fā)給用戶,屬于濫用企業(yè)證書。也有些 App 本身內(nèi)容并沒有什么不妥,實際可以上架 AppStore。但它包含內(nèi)購,而不想給蘋果分成。蘋果規(guī)定,假如 App 內(nèi)購買的虛擬物品,是用于 App 本身的,就需要接入并且只能接入蘋果的應(yīng)用內(nèi)購買(In-App Purchase,IAP),比如某些會員充值,游戲道具購買之類。但假如使用蘋果的 IAP,內(nèi)購收益需要分給蘋果三成。有些 App 不想給蘋果分成,想使用微信、支付寶等第三方支付,就用企業(yè)證書來分發(fā) App。對于蘋果公司來說,這也是濫用企業(yè)證書。蘋果公司不允許濫用企業(yè)證書。一旦發(fā)現(xiàn),情況惡劣,會封殺企業(yè)證書,企業(yè)證書被封殺后,企業(yè)自己發(fā)布的 App 就閃退不能用了。另一個懲罰是,將開發(fā)者(個人或公司)列入黑名單。列入黑名單后,審核通常會非常慢。有時不僅僅是違規(guī) App,而是這個開發(fā)者名下的所有 App 審核都非常慢。正常情況下,App 平均審核時間是兩三天。但黑名單上的開發(fā)者,有時會審核幾周,甚至幾個月。幾個月不能發(fā)布新版本,就會損失很大。更重的懲罰是,將開發(fā)者名下的 App 全部下架,整改后才能重新上架。有些企業(yè)為了避免牽連,有時會用不同的銀行卡注冊不同的開發(fā)賬號。需要用不同的銀行卡,因為蘋果公司會檢查銀行卡賬號,銀行卡賬號相同的,基本可以判斷是同一個用戶。自然有時會誤殺。個人開發(fā)者,不要將自己的銀行卡借給他人(比如親戚)注冊開發(fā)者賬號,不然可能會受到牽連。蘋果對企業(yè)證書管理比較嚴(yán),催生了淘寶上的一個生意,租售企業(yè)證書。有些 App,因為內(nèi)容違規(guī)或其它原因不能上架,但又不想暴露自己的企業(yè)證書。就會在淘寶上租借或購買其他企業(yè)證書來簽名發(fā)布,跟蘋果公司打游擊戰(zhàn)。淘寶某個企業(yè)證書暴露被封殺了,又換一個企業(yè)證書重新簽名發(fā)布。------------------------iOS 證書,實際是某種數(shù)字簽名。數(shù)字簽名基于非對稱加密,目的是保證文件沒有被篡改。比如 Alice 想發(fā)文件給 Bob,就生成一對私鑰和公鑰。Alice 保留私鑰,而將公鑰發(fā)給 Bob(也可不通過網(wǎng)絡(luò)而用其它手段,比如郵寄一個存儲公鑰的 U 盤)。要發(fā)文件了,Alice 就先計算文件的摘要,然后將摘要用私鑰加密,將文件和加密摘要一起發(fā)給 Bob。Bob 就用公鑰將摘要解密,同時計算出文件的摘要信息。之后對比解密后的摘要,和計算出來的摘要,假如兩者相同,就表示文件沒有被篡改。下面我粗略描述一下 App 認(rèn)證流程,細(xì)節(jié)可能有誤。蘋果有一對私鑰和公鑰,私鑰在他的服務(wù)器上,經(jīng)過重重保護(hù)。而對應(yīng)的公鑰內(nèi)嵌在每一臺 iOS 設(shè)備上。當(dāng)開發(fā)者注冊證書時,會在本機生成私鑰和公鑰,將公鑰上傳給蘋果服務(wù)器。蘋果服務(wù)器用自身的私鑰,對開發(fā)者上傳的公鑰做數(shù)字簽名,生成證書(cer)。經(jīng)過蘋果的私鑰簽名,就保證這個開發(fā)者證書沒有被篡改。這個證書并非公鑰本身,但它包含了公鑰。同時開發(fā)者會將 App 的描述文件(.mobileprovision) 下載回本機。描述文件主要用于控制 App 的權(quán)限,比如這個是否推送、是否支持 iCould 等。原則上,證書(cer) 和描述文件(.mobileprovision) 是可以合并的。但每個 App 的權(quán)限都有所不同,于是就將其拆分成證書和描述文件。當(dāng) App 構(gòu)建簽名時,選擇證書(cer) 和描述文件(mobileprovision),會尋找對應(yīng)的私鑰,找不到私鑰就會簽名失敗。之后計算 App 所有資源的摘要,將摘要用私鑰加密,生成一個 _CodeSignature 的目錄。同時會將公鑰和權(quán)限信息嵌入到最終生成包中,生成 embedded.mobileprovision。_CodeSignature 中的摘要經(jīng)過私鑰加密,embedded.mobileprovision 包含對應(yīng)的公鑰用于加密(這個公鑰經(jīng)過蘋果自身私鑰的簽名,保證不會被篡改)。私鑰只在本機中保存,用于構(gòu)建時加密,并不會包含在安裝包中。上述簽名過程,Xcode 是全自動的,開發(fā)者沒有必要了解其過程。整個流程,私鑰都只保存在本機中,并沒有經(jīng)過網(wǎng)絡(luò),假如私鑰經(jīng)過網(wǎng)絡(luò)傳輸,就可能被竊取而不夠安全。而本機上的私鑰,可以導(dǎo)出成 p12 文件,導(dǎo)入到另一臺開發(fā)機中。------------------------用戶安裝這個 App 后,需要手動信任描述文件。信任后,蘋果用自家的公鑰來驗證開發(fā)者的公鑰沒有被篡改。再用開發(fā)者的公鑰將 _CodeSignature 保持的摘要信息解密,驗證 App 的資源本身沒有被篡改。經(jīng)過驗證,App 就可以運行。App 內(nèi)的描述文件,需要用戶手動選擇信任。App 不可能在用戶不知情的情況下偷偷運行。企業(yè)證書簽名過的 App, 加密的摘要,和用于解密的描述文件都包含在安裝包中。因此用戶用Safari 打開鏈接、安裝、信任描述文件后,就可以運行。而開發(fā)者上傳到 AppStore 上的 App,會經(jīng)過蘋果的私鑰重新加密簽名。因此在 AppStore 上下載的 App,不用手動點信任,也可以直接運行。iOS 設(shè)備必然可信任蘋果自身的證書。iOS 也有第三方應(yīng)用商店,比如 PP 助手、同步推等等。這些商店號稱免費安裝任何 App,實際是去抓別人的 App,用自己的企業(yè)證書重新簽名。因而信任第三方商店證書之后,就可以免費運行眾多收費 App。但這是有隱患的,你不知道這些商店重新簽名時,添加了些什么東西。第三方商店為了盈利,也很有動力偷偷添加些佐料。從第三方商店下載的 App 往往過了一段時間就突然閃退不能用了,很可能是他們的企業(yè)證書過期或者被封殺了。對于最終用戶,沒有必要理解上述驗證。只需要記住,不要安裝來歷不明的 App。就算不小心安裝了,也不要信任其描述文件。只要不信任,它就沒有辦法運行。只在 AppStore 下載 App,不要為了貪小便宜去第三方商店下載 App,也不要越獄 iOS 系統(tǒng)。現(xiàn)在的手機不單單是電話本身,還是你的錢包、名片,實在太重要了。
總結(jié)
以上是生活随笔為你收集整理的App 上架 AppStore和证书的各种区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “约见”面试官系列之常见面试题第二十一篇
- 下一篇: “约见”面试官系列之常见面试题第十四篇之