什麼是 iOS code signing、Distribution Certificate 和 Provisioning Profile? 更新或撤銷它們會有什麼影響?

Michael Revlis
7 min readApr 4, 2022

iOS code signing 是每一個 iOS 開發者都碰過,但也都不太熟的,除了 Xcode 的 automatically manage signing 幫開發者處裡掉這些問題外,distribution certificate 和 provisioning profile 一年才過期一次,這類繁雜的事情要不是 CD 工具處裡掉,就是久久才人工處理一次,導致許多開發者對此似懂非懂,甚至某些公司分工分得很細,開發功能的人根本不用處理這些事。

本篇會用買一本書做為譬喻,來介紹 iOS 的 code signing 認證機制,並解釋 distribution certificate、provisioning profile 是什麼,並著重更多在實務上可能會遇到的應用題。觀念的部分多是打個比方,如果想看詳細且嚴謹的說明,非常推薦看這篇:

從買書來認識 iOS 認證機制

現在資訊發達,買東西肯定是先上網查察評價。買書的話也是,除了看暢銷排行榜上有什麼外,可能還會看一下作者是誰。而除了作者外,還可能會翻一下推薦序是誰寫的,通常是相關領域的佼佼者,或是一些名人,顯然這本書受到了他們的青睞與肯定。

我們把開發者想像成作家,app 當作是創作出來的書籍。但在這個競爭激烈的市場中,消費者怎麼知道誰得書好看呢? 在 iOS 的世界裡,讀者(iOS 裝置,如 iPhone 手機)是認這本書的推薦序(distribution certificate)是誰寫的,如果是 Apple Certificate Authority 寫的,那肯定是嚴選好書,即便我不認識作者(開發者),但我相信 Apple 的眼光。所以 iOS 的 code signing 讓每次 app 在安裝/開啟時,省去了一一確認開發者是誰的步驟,直接驗證 certificate 是否是 Apple 所核發的,因為相信 Apple 已經驗證過開發者是誰了,所以進而相信開發者。

除了推薦序以外,書的內頁也會載明出版商、譯者、編輯、印刷版本等資訊,我們可以從這邊知道翻譯是否換人了? 現在是第幾版? 而 provisioning profile 扮演的就是這樣的功能,provisioning profile 上除了 app bundle ID (書名)、distribution certificate (推薦序)外,還有此 app 是否啟用推播、Apple Pay、Apple Sign-In 等功能。每次更新這些資訊,provisioning profile 也都會跟著更新,以記載最新的狀態。

另外在打包 app 的時後有一個動作叫做 singning binary,這好比是針對書的內容章節,幫它做一個目錄跟對應的頁數(hash of a file),如果作者有增刪什麼內容,那這個目錄及頁數都會改變,所以只要對一下目錄上的頁數,跟實際上的頁數是否一致,就知道內容是否有被異動過了。

renew/revoke or remove certificate 和 provisioning profile 會發生什麼事?

先講結論:不會怎麼樣。隨時想更新、撤銷/刪除或不小心過期了都不會怎麼樣。不過還是有些但書,後面娓娓道來,細節可參考官方說明

首先 distribution certificate 是 Apple 拍胸鋪認證的證明,承接上面的譬喻情境,Apple 說「這本書很好看,但我每年都會重新評選一次,所以請留意 certificate 的有效期間是哪一年間」。但已經印刷出去的書呢,它的推薦序不會因為時間到了就消失,書仍在書店中販售。所以在 AppStore 上的 app 仍可以被下載,也可以打開使用,不論當初的 certification 是過期、撤銷或是更新了,都不會影響已上架的 app。

但這有一個前提,那就是你是 Apple Developer Program。如果是 iOS Developer Enterprise Program 的話,則會讓所有已安裝的 app 都無法使用。Enterprise Program 為了滿足內部使用這個的需求,允許 app 不透過 AppStore 就可安裝到 iOS 裝置中。既然是企業內部使用,那企業就對這個 app 的控管負責,在這個機制下如果要安裝/開啟 app,第一件事都是去線上驗證此 app 中的 certificate 是否仍有效。所以有使用 MDM (Mobile Device Management) 來安裝 app 的朋友可要注意了! 可以看看官方的相關說明。(p.s. iOS Developer Enterprise Program的 distribution certificate 效期則相對地延長到三年)

但作者如果想要再版時,就不能再拿過期的推薦序(distribution certificate)放在新版的書中。故開發者必須要先更新 certificate 才可以在 AppStore 上發佈新的更版(開始印刷下一版)。

再來是 provisioning profile,在前面的譬喻中我們說它包含的是書的出版細節,試想一下一本暢銷書,再版了五六次,但會因為第八版出來了,前面的第七版就不能看了嗎? 並不會,所以 provisioning profile 不管更新多少次都不會對架上的 app 有任何影響。而我們平常在設定 app capabilities 的時候 Xcode 也會自動幫我們更心 provisioning profile,如果是在 Apple Developer Portal 上設定的話網站也會跳出相關的提示訊息:

到這邊先整理一下,書的推薦序跟出版資訊都會印在書上,iOS app 的 distribution certificate 和 provisioning profile 也是,都會在打包 app 的時候一起包上去,所以這些東西會跟著 app 一起上到 AppStore,然後被使用者下載下來,如此一來不論是 certificate 還是 provisioning profile,日後開發者對它們的異動(更新、撤銷/移除)都不會對架上的 app 或已經安裝到使用者手機上的 app 有任何影響,使用者手機上的仍是當初我們打包時的那份 certificate、provisioning profile。

這是 iOS 的 code signing 機制,尤其是 certificate 的應用機制跟網頁的 certificate 不太一樣。工作上常遇到合作廠商其實並不是那麼瞭解,聽到 certificate 被異動到了氣得直跳腳;又或是新人一聽到被指派去處理 certificate 就戰戰兢兢、瑟瑟發抖。希望在讀完這篇文章後,能更清楚地了解 certificate 和 provisioning profile 所扮演的角色,以及異動它們意味著什麼。而準備要寫自動化工具的朋友,也能知道一般的 iOS Developer Program iOS Developer Enterprise Program 是有所差異的,如果公司剛好同時兩種帳號都有,那就要格外留意了,要動 Enterprise Program 帳號下的 distribution certificate 要三思,它可是會影響到線上的 app 的。

--

--