在網絡中,咱們經過對信息進行數字簽名,來驗證信息的真實性、完整性。若是將數字簽名運用到代碼中,即對可執行文件(Mach-O
)或腳本(代碼
)進行數字簽名,即可保證app在簽名後不被修改或損壞,保護app代碼的完整性和安全性,這就是 代碼簽名。基於代碼簽名的這個特色,幾乎全部的軟件公司在發佈app時都會對其進行代碼簽名,蘋果公司也不例外。蘋果的app簽名機制能確保安裝到用戶蘋果設備(如iPhone
、iPad
等)上的app都是通過蘋果官方容許的。接下來,咱們來詳細介紹一下iOS簽名原理。瀏覽器
數字簽名是 非對稱加密技術 與 數字摘要技術(Hash) 的應用。安全
先了解幾個iOS簽名相關的名詞服務器
App ID
用於標識一個或者一組App。主要有兩種:網絡
team id
和app的bundle id
組成。每一個app都會有且僅有一個明確的Explicit App ID
。*
結束,如com.company.*標識以com.company開頭的全部應用程序。Certificate
是用來給應用程序簽名的,只有通過簽名的應用程序才能保證他的來源是可信任的,而且代碼是完整的、未經修改的。證書的後綴爲.cer
app
在咱們申請證書前,須要先申請一個
CSR
(即Certificate Signing Request)文件,此過程其實是生成一對密鑰
(即公鑰和私鑰),這對密鑰將保存在開發者Mac電腦的Keychain
(即鑰匙串訪問)中,CSR文件中則包含公鑰。post
證書類型有不少種,這裏簡單介紹一下常見的:測試
iOS App Development
(即開發證書),用於開發和真機調試appiOS Distribution (App Store and Ad Hoc)
(即分發證書),用於蘋果應用市場(App Store)和內部分發渠道(Ad Hoc)APNS
(Apple Push Notification Service,即蘋果推送證書),用於推送通知到app。
APNS
與App ID
有關。APNS
有兩種證書,分別是用於開發環境的 iOS Apple Push Notification service SSL (Sandbox)
,以及用於生產環境的 Apple Push Notification service SSL (Sandbox & Production)
。若是你的app有推送服務,這兩種推送證書都是須要建立的。也叫作p12證書
,由於其自己就是一個加密的證書,後綴爲.p12
。開發者將CSR
文件發給蘋果服務器,由此蘋果服務器會生成Certificate
文件(含公鑰),接着開發者將其下載到本地,再導入鑰匙串
中後,就能夠從鑰匙串
中導出p12證書
。顯然,p12
文件裏面有匹配的公鑰和私鑰。網站
注意:
p12
文件通常是給開發團隊的其餘人使用的。當別人拿到p12
文件和描述文件
(後面會講到),輸入正確的密碼後,就能夠將p12
導入到他的Mac設備的鑰匙串中,而後再雙擊描述文件
,便可添加到XCode
中,從而參與團隊開發。加密
Devices
中包含了蘋果開發者帳號中全部可用於開發和測試的設備,每臺設備使用UDID
來惟一標識。在蘋果開發者帳戶每一年的會員期內,你能爲每一個產品添加最多100 個設備。調試
獲取UDID的方法有不少種,做者經常使用的是在
iPhone
的Safari
瀏覽器中打開 fir.im/udid 網站便可獲取設備的UDID。
一個描述文件包含了App ID
、Certificate
、Device
,其後綴爲.mobileprovision
。經常使用的有:
描述文件的做用主要是:
描述文件中還包含
Entitlements
(權限信息),權限信息指明瞭app使用的蘋果服務,如iCloud權限、推送、蘋果內購等。
相信大多數開發者都實際操做過【申請證書和真機調試】(網上教程也多),那麼問題來了,在【開發者用XCode
打包app,並將其安裝到手機】的過程當中,蘋果具體作了什麼?這就要說到蘋果的iOS簽名流程了,能夠用這幅圖歸納:
說明:蘋果官方有一對密鑰,即私鑰和公鑰,私鑰在蘋果後臺,公鑰在iOS系統中(如
iPhone
手機在出廠後,其中就保存有蘋果官方的公鑰);在Mac
系統打包app時也會生成一對密鑰(私鑰、公鑰),並保存在鑰匙串
中。爲了區分這兩對密鑰,將蘋果官方的那對密鑰記爲A,即私鑰A
、公鑰A
;將Mac系統生成的那對密鑰記爲M,也就是私鑰M
、公鑰M
。
下面咱們分析一下 iOS的簽名原理(包括簽名
與驗證
):
XCode在向蘋果服務器申請證書前,會先向鑰匙串申請一個CSR
文件,同時生成一對非對稱加密密鑰,也就是私鑰M
和公鑰M
,並將公鑰M
放在CSR
中。
XCode把CSR
文件發送給蘋果服務器,用於申請證書。
蘋果服務器用私鑰A
對收到的公鑰M
進行簽名,生成Certificate
文件(即證書,後綴名爲.cer
,裏面有公鑰M
)。接着對Certificate
、Devices
、App ID
以及Entitlements
一塊兒組成的數據用私鑰A
進行簽名,生成Provisioning Profile
(即描述文件),並將它發給XCode。
iOS項目在編譯完成以後會生成.app
文件,你能夠在XCode
的Project
中找到它。有了.app文件,XCode先使用私鑰M
對.app
進行簽名,而後,把.app
和描述文件
一塊兒壓縮成安裝包.ipa
文件。
以上爲
簽名
過程。補充說明:XCode用
私鑰M
對.app
的簽名分爲兩部分。
- 是對資源文件的簽名,生成的簽名文件名爲
CodeResources
,存放在.app
目錄下的_CodeSignature
文件夾中。- 是對app的簽名,其簽名信息存放在
Mach-O
的Code Signature
中。(ps:關於Mach-O,做者之後會專門寫一篇博文講解)
XCode準備把安裝包安裝在蘋果設備(如iPhone)上。
iPhone對安裝包進行驗證,即用公鑰A
驗證描述文件中的簽名。驗證經過則說明描述文件裏的數據是蘋果受權的。
當第【6】步驗證經過後,再用公鑰A
驗證證書
中的簽名。驗證經過則說明公鑰M
是安全可信任的。
第【7】步驗證經過後,就能夠取出描述文件裏的數據作各類驗證,包括用公鑰M
驗證App簽名,驗證iPhone是否在設備列表中,App ID是否對得上,使用的權限是否跟Entitlements
對應等。當這些所有驗證經過,iPhone就能夠安裝app了。
以上就是iOS簽名
的流程分析了,也就是iOS簽名原理
。顯然,蘋果用了兩對非對稱加密密鑰,進行的是雙重驗證
,基本保證了XCode真機調試
的安全性,確保app的安裝行爲是受到蘋果管控的。
理解
iOS簽名原理
後,再去對照實際申請證書的操做流程,相信你會有新的體會。
引伸:
Ad Hoc分發流程
與上述真機調試流程
基本一致。In House企業分發流程
也是大同小異,只是企業簽名不限制安裝的設備數,只要用戶在iOS系統中信任企業證書,便可安裝該企業證書籤名的app了。最後說一下App Store的簽名驗證
,它與前面提到的簽名驗證有所不一樣。當開發者將ipa包上傳到App Store後,蘋果後臺只須要用私鑰A
對其簽名便可。當蘋果設備(如iPhone)安裝從App Store
下載的安裝包時,會自動用設備中的公鑰A
對app的簽名
進行驗證,經過後便可正常安裝。
感興趣的同窗能夠去
App Store
下載ipa包,看看裏面是否有描述文件
。
思考:爲何發佈App Store
的安裝包時須要用到描述文件
?若是證書
和描述文件
過時或被廢除,會影響App Store
上的安裝包嗎?
歡迎你們在下方留言討論~