尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
為什麼蘋果允許用戶安裝未受信任的企業級開發者所開發的軟件?
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 本身的,就需要接入蘋果的應用內購買(IPA), 不能使用第三方支付。但假如使用蘋果的 IPA,內購收益需要分給蘋果三成。有些 App 不想給蘋果分成,想使用微信、支付寶等第三方支付,就用企業證書來分發 App。對於蘋果公司來說,這也是企業證書的濫用。
蘋果公司不允許濫用企業證書。一旦發現,情況惡劣,會封殺企業證書,企業證書被封殺後,企業自己發布的 App 就不能用了。
另一個懲罰是,將開發者(個人或公司)列入黑名單。列入黑名單後,審核通常會非常慢。有時不僅僅是違規 App,而是這個開發者名下的所有 App 審核都非常慢。正常情況下,App 平均審核時間是兩三天。但黑名單上的開發者,有時會審核幾周,甚至幾個月。幾個月不能發布新版本,就會損失很大。
更重的懲罰是,將開發者名下的 App 全部下架,整改後才能重新上架。
有些企業為了避免牽連,有時會用不同的金融卡註冊不同的開發帳號。需要用不同的金融卡,因為蘋果公司會檢查金融卡帳號,金融卡帳號相同的,基本可以判斷是同一個用戶。自然有時會誤殺。個人開發者,不要將自己的金融卡借給他人(比如親戚)註冊開發者帳號,不然可能會受到牽連。
蘋果對企業證書管理比較嚴,催生了淘寶上的一個生意,販賣企業證書。有些 App, 因為內容違規或其它原因不能上架,但又不想暴露自己的企業證書。就會在淘寶上購買其他企業證書來簽名發布,跟蘋果公司打遊擊戰。淘寶某個企業證書暴露被封殺了,又換一個企業證書重新簽名發布。
————————
iOS 證書簽名,實際是某種數字簽名。數字簽名基於非對稱加密。我粗略描述一下認證流程,細節可能有誤。
當開發者註冊證書時,會在本機生成私鑰和公鑰,將公鑰上傳給蘋果服務器,生成一個描述文件(.mobileprovision),將描述文件下載回本機。描述文件並非公鑰本身,但它包含了公鑰,也包含了其它必要信息。
當 App 構建簽名時,選擇描述文件(mobileprovision),會尋找對應的私鑰,找不到私鑰就會簽名失敗。之後計算 App 所有資源的摘要,將摘要用私鑰加密,生成一個 _CodeSignature 的目錄。同時會將 mobileprovision 嵌入到最終生成包中,生成 embedded.mobileprovision。_CodeSignature 中的摘要經過私鑰加密,embedded.mobileprovision 包含對應的公鑰用於加密。私鑰只在本機中保存,用於構建時加密,並不會包含在安裝包中。
上述簽名過程,Xcode 是全自動的,開發者沒有必要了解其過程。整個流程,私鑰都只保存在本機中,並沒有經過網路,假如私鑰經過網路傳輸,就可能被竊取而不夠安全。而本機上的私鑰,可以導出成 p12 文件,導入到另一台開發機中。
用戶安裝這個 App 後,需要手動信任描述文件。信任後,iOS 系統用公鑰將 _CodeSignature 保持的摘要信息解密,同時計算出 App 的資源摘要信息。解密的摘要和計算的摘要做對比,對比後相同就表示資源沒有被篡改,App 才可以運行。
App 內的描述文件,需要用戶手動選擇信任的。App 不可能在用戶不知情的情況下偷偷運行。企業證書簽名過的 App, 加密的摘要,和用於解密的描述文件都包含在安裝包中。因此用戶用Safari 打開鏈接、安裝、信任描述文件後,就可以運行。
而開發者上傳到 AppStore 上的 App,會經過蘋果的私鑰重新加密簽名。蘋果的私鑰在他的服務器上,經過重重保護。而對應的公鑰就在每一台 iOS 設備上。因此在 AppStore 上下載的 App,不用手動點信任,也可以直接運行。iOS 設備必然可信任蘋果自身的證書。
iOS 也有第三方應用商店,比如 PP助手、同步推等等。這些商店號稱免費安裝任何 App,實際是去抓別人的 App,用自己的企業證書重新簽名。因而信任第三方商店證書之後,就可以免費運行眾多收費 App。但這是有隱患的,因為你不知道這些商店重新簽名時,添加了些什麼東西。第三方商店為了盈利,也很有動力在偷偷添加些佐料。
對於最終用戶,沒有必要理解上述驗證。只需要記住,不要安裝來歷不明的 App。就算不小心安裝了,也不要信任其描述文件。只要不信任,它就沒有辦法運行。只在 AppStore 下載 App,不要為了貪小便宜去第三方商店下載 App,也不要越獄 iOS 系統。現在的手機不單單是電話本身,還是你的錢包、名片,實在太重要了。