App 上架 AppStore和證書的各種區別

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章