Code Signing 流程與名詞解釋

Journey on programming
4 min readMay 24, 2018

--

這次的筆記重點在於 Code-Signing 的流程,以及各項的名詞解釋,針對這一段,每次念完要用的時候都會忘記,所以乾脆自己寫一下筆記,順便也幫助迷途的開發者。

整段的過程大致上分為下列幾個步驟:

  1. 從本地 KeyChain 產生 .codeSigningRequest
  2. 上傳到 Apple Devleoper 進行加簽,並且下載加簽完成的 .certificate
  3. 安裝 .certificate 到本地的 KeyChain 當中
  4. 從 Apple Developer Panel 註冊 App Bundle Identifier
  5. 下載 Provisioning Profile 到本地端的 XCode 進行匯入

上述有幾個重點可以做一下註記

code signing process

之所以需要透過 codeSigningRequest 上傳到 Apple Devleoper 進行加簽的原因,是因為需要驗證開發者,確保這個 app 是由這台電腦所進行開發,有點像是簽名畫押的感覺,然後因為我們在安裝 XCode 的時候,就會一並把根憑證也安裝進去,所以透過 Apple 所發出的憑證,電腦自然就會信任了。

為什麼需要第三方來將公鑰加簽成憑證呢?

因為全世界能解開我用這把私密金鑰加密的訊息只有和它成對的公開金鑰,如果能確定這把公開金鑰是我發行的,你就能用這把公開金鑰來驗證我的身分,所以公開金鑰需要有第三方公正機構加簽背書。

所以其實簡單來說,憑證 = 公鑰 + 數字簽名 + 使用期限,然後透過信任的第三方機構來做發行,確保此憑證的合法性。

憑證的種類

Development Certificate

  • iOS App Development
    簽署測試用的APP以安裝在實機上。
  • Apple Push Notification service SSL (Sandbox)
    當你的APP需要使用到Apple Push Notification功能時需要使用此種憑證,開啟沙箱功能。

Production Certificate
Production 憑證又分成5種各針對不同需求的 APP

  • App Store and Ad Hoc
    使用於提交到 App Store 或特殊用途的簽證如:TestFlight。
  • Apple Push Notification service SSL (Production)
    當提交的應用程式需要使用 Apple Push Notification 功能的時候。
  • Pass Type ID Certificate
    當APP需要更新Passbook資料的時候
  • Website Push ID Certificate
  • VOIP Services Certificate

bundle identifier

app 的識別碼,可以將其想成是 app 的身分證字號,對每一個 app 來說,這組識別碼是獨一無二的。
主要分成兩種

  1. Explicit: 用來針對單一 app 命名,通常是透過反網址的方式進行。例如 com.nicklee.MyApp 如果需要使用 Push Service 則一定得使用該種命名方式。
  2. Wildcard: 透過匹配符號的概念,或是取得部份符合命名規則的 app ,例如 com.nicklee.* 這個的意思是指開頭是 com.nicklee 底下的全部 app,主要是用來進行相關 app service 的授權。

provisioning profile

可以想成是包含了 App Id, Certificates, Device 資訊列表的的一個檔案。會被打包進 app 當中,主要是用來確認該 app 是否合法,透過 Certificate 來驗證開發者是誰,然後透過 App Id 來設定啟用相關功能,最後在測試的時候,確定該裝置的 uuid 是否也一並被打包進 device 列表當中。

Reference

http://andyyou.logdown.com/posts/216618-ios-app-shelves-certificate-process-notes

--

--

Journey on programming

Software Developer at 91APP. If you like my articles, please clap and follow me on Medium. Never stay still, never plateau!