前言

說到這個憑證,一直以來都是我很頭大的一個項目。只知道要從電腦裡面匯出 CSR,然後下載 .cer 檔案,還要下載 provision profile 等。就是一些很不直覺的動作。

後來不知道 Xcode 第幾版後開始支援 Automatically manage signing

開心到睡不著啦😆😆😆,只要一勾起來就什麼煩惱都沒有了啊!!當下覺得這真的是這世界上最偉大的發明了啊~~~

But, 就是這個 But...
就在某一次的面試當中被洗臉之後,我發現還是不能這樣得過且過,還是要認真把憑證搞清楚...


了解憑證之前,要先知道什麼是 非對稱式加密,詳情請看➡️維基百科 ⬅️。

看完非對稱式加密後,就可以來看看用戶版的 app 下載與驗證的過程

用戶版

在每個 iOS 裝置出廠時就配置好一把 Apple 產出的公鑰,而私鑰就由 Apple 自己保管著。當開發者將開發好的 App 上傳到 Apple 時,Apple 就會用他的私鑰對 App 加密。而用戶透過 App Store 下載 App,裝置上的公鑰就會對 App 進行驗證,若驗證成功表示這個 App 沒有修改過,就會進行安裝。也就是每一個 App 都是通過 Apple 官方允許可以正常安裝在裝置上的。


開發者版

CSR / CER

但是在開發過程中,開發者會需要不斷的除錯或是增加新功能,總不能每次開發到一個階段就要送到 App Store 下載驗證吧!所以這時候就又多了一個開發者專用的流程。
Mac 系統自帶一組公鑰 & 私鑰,當我們從 Keychain Access 匯出 CSR 檔時,裡面帶有開發者及公鑰等相關資訊。


接下來,我們需要把 CSR 上傳到 Certificates ,同時 Apple 會用私鑰對 CSR 進行加密,我們再把 .cer 檔下載回來後點擊兩下後安裝到電腦裡面。回到 Keychain Access 可以看到原本的 .cer 檔跟我們的私鑰綁再一起。

Provisioning Profile

當我們設定好 Identifiers & Devices 來到 Provisioning Profile 這區新增一個 Profile。下載開發者設定好的 xxx.mobileprovision 檔後導出 .plist 就會看到這個檔案裡面包含了 AppIDName, TeamIdentifier, UUID, application-identifier 等資訊。

security cms -D -i your provisioning name.mobileprovision -o provision.plist
AppIDName > App 的名稱
TeamIdentifier > 憑證編號
UUID > 註冊的裝置
application-identifier > 這個是 app 的身份辨識碼。是憑證編號 + Bundle Indetifier
(所以如果今天你是用企業簽的 app,發現無法覆蓋安裝時,應該就是他的憑證編號或是 Bundle Indetifier換了)

企業憑證跟個人憑證基本上沒有什麼差別,最大的差別在於 UUID, Apple 限制個人開發者最多只能有100個實體裝置,而企業憑證沒有這個限制。
所以在這個 xxx.mobileprovision 裡面看到的是 ProvisionsAllDevices 而非單一裝置的 uuid。

打包

現在萬事俱備,只缺東風啦!

打包時,Xocde 會拿出電腦的私鑰將 app 加密,同時將 xxx.mobileprovision 改名為embedded.mobileprovision,把 .cer & embedded.mobileprovision 放到名為 Payload 的資料夾裡並包成xxx.ipa。
iPhone 在安裝 app 時會從 ipa 裡面取出 .cer 檔,透過 iPhone 裡面的公鑰進行驗證其正確性。而在透過 .cer 裡面的 CSR 檔去驗證這個App的正確性,確認無誤後再檢查 embedded.mobileprovision,確認這隻手機的 uuid 有包含在檔案裡面才能正常安裝在該裝置上。


參考文件:
深度长文:细说iOS代码签名 (非常推薦👍👍👍)
iOS 应用签名原理及重签技术
iOS-签名机制和证书原理
iOS App 签名的原理