為什么蘋果允許用戶安裝未受信任的企業級開發者所開發的軟件?


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 證書簽名,實際是某種數字簽名。數字簽名基於非對稱加密,目的保證文件沒有被篡改。比如 A 要發文件給 B, A 生成一對私鑰和公鑰。A 保留私鑰,而將公鑰發給 B(或者將公鑰預先給B)。要發文件了,A 就先計算文件的摘要,之后將摘要用私鑰加密。之后將文件和加密摘要一起發給 B,B 就用公鑰將摘要解密,同時計算出文件的摘要信息。之后 B 對比解密后的摘要,和計算出來的摘要,假如兩者相同,就表示文件沒有被篡改。

下面我粗略描述一下認證流程,細節可能有誤。

蘋果有一對私鑰和公鑰,私鑰在他的服務器上,經過重重保護。而對應的公鑰內嵌在每一台 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。就算不小心安裝了,也不要信任其描述文件。只要不信任,它就沒有辦法運行。只在 AppStore 下載 App,不要為了貪小便宜去第三方商店下載 App,也不要越獄 iOS 系統。現在的手機不單單是電話本身,還是你的錢包、名片,實在太重要了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM