JB的測試之旅-IOS證書及簽名

jb發表於2018-08-01

前言

最近在負責ios的專案,被各種證書跟簽名概念弄的一臉懵逼,而且之前也沒怎麼接觸過IOS的測試,顯的更加小白了,因此想把這塊知識彌補下;

簽名

目的

先來看看蘋果的簽名機制是為了做什麼。
在 iOS 出來之前,在主流作業系統(Mac/Windows/Linux)上開發和執行軟體是不需要簽名的,軟體隨便從哪裡下載都能執行,導致平臺對第三方軟體難以控制,盜版流行。
蘋果希望解決這樣的問題,在 iOS 平臺對第三方 APP 有絕對的控制權,一定要保證每一個安裝到 iOS 上的 APP 都是經過蘋果官方允許的,怎樣保證呢?就是通過簽名機制。

對稱加密

一般說的簽名指的就是數字簽名,它是基於非對稱加密演算法實現的;
什麼是非對稱加密?
非對稱加密是相對於對稱加密而言的;
但無論是哪種方式的加密,目的都是為了保護被加密的內容;

度娘關於對稱加密的解釋:

採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,
這種加密方法稱為對稱加密,也稱為單金鑰加密。
複製程式碼

嗯,看不懂吧?懵逼吧?沒關係,接著看~

jb有一封信,只想給自己跟YY看,於是JB為這封信設定了密碼(加密),然後寄給YY,YY只要知道信的密碼就可以檢視其中的內容(解密),別人即使拿到信想看,但沒有密碼(金鑰),也無法檢視裡面的內容;

所謂的對稱就是加密和解密的過程使用的是相同的金鑰;

非對稱加密

與對稱加密不同,非對稱加密演算法的加密和解密使用不同的兩個金鑰.這兩個金鑰就是我們經常聽到的公開金鑰(公鑰)和私有金鑰(私鑰);

公鑰和私鑰的關係是:
公鑰和私鑰一般成對出現;

如果你的訊息使用公鑰加密,那麼需要該公鑰對應的私鑰才能解密;

如果你的訊息使用私鑰加密,那麼需要該私鑰對應的公鑰才能解密;

非對稱加密的作用是:
保護訊息內容, 並且讓訊息接收方確定傳送方的身份;

不懂?接著看吧~

還是上面的例子,使用對稱加密的問題在於,一旦金鑰在傳輸過程中洩露了,保密性就蕩然無存了;

既然對稱加密的安全性會低一些,那就採用非對稱加密,這樣,JB 跟 YY就需要各自持有一對屬於自己的公鑰和金鑰

JB寫的信只想給YY看,那麼YY跟別人會有什麼不一樣的特質呢?那就是YY擁有隻有他自己知道的金鑰!
如果JB使用YY的公鑰加密,那麼就只有YY的金鑰才能解密,這樣就能達到只讓YY看的目的;

這裡需要說明下,公鑰是公開給別人開的哦

那有一種情況,既然YY的公鑰是公開的,假如有一個SB想冒充JB,使用YY的公鑰加密然後給YY寫一封信;

JB為了避免這種情況的發生,把信的內容用JB自己的金鑰進行加密,YY收到信後,使用JB的公鑰解密(只有JB的公鑰才能解開使用JB私鑰加密的內容),如果可以解開,那麼YY就知道這封信的確是JB發的,這是為了確定訊息傳送方的份;

可能文字看上去會懵逼,因此就花了個流程圖,便於理解:

JB的測試之旅-IOS證書及簽名

JB的測試之旅-IOS證書及簽名

JB的測試之旅-IOS證書及簽名

上面這個,就是非對稱加密,回到IOS本身,當我們想把寫好的IOS程式執行到真機時,會使用到這種非對稱加密的方式進行認證,從而確保程式的來源是可信且安全的~

數字簽名&證書

那數字簽名又是什麼?
簡單的話,數字簽名的作用是對某一份資料打了標記,表示認這份資料,相當於簽了個名,然後再傳送給其他人,其他人可以知道這份資料是經過我認證的,資料沒有被篡改過;

這裡的話,直接貼一峰大神的翻譯文章,方便了解;
連結如下:數字簽名是什麼

1)鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。

JB的測試之旅-IOS證書及簽名

2)鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。

JB的測試之旅-IOS證書及簽名

3)蘇珊要給鮑勃寫一封保密的信。她寫完後用鮑勃的公鑰加密,就可以達到保密的效果。

JB的測試之旅-IOS證書及簽名

4)鮑勃收信後,用私鑰解密,就看到了信件內容。這裡要強調的是,只要鮑勃的私鑰不洩露,這封信就是安全的,即使落在別人手裡,也無法解密。

JB的測試之旅-IOS證書及簽名

5)鮑勃給蘇珊回信,決定採用"數字簽名"。他寫完後先用Hash函式,生成信件的摘要(digest)。

JB的測試之旅-IOS證書及簽名

6)然後,鮑勃使用私鑰,對這個摘要加密,生成"數字簽名"(signature)。

JB的測試之旅-IOS證書及簽名

7)鮑勃將這個簽名,附在信件下面,一起發給蘇珊。

JB的測試之旅-IOS證書及簽名

8)蘇珊收信後,取下數字簽名,用鮑勃的公鑰解密,得到信件的摘要。由此證明,這封信確實是鮑勃發出的。

JB的測試之旅-IOS證書及簽名

9)蘇珊再對信件本身使用Hash函式,將得到的結果,與上一步得到的摘要進行對比。如果兩者一致,就證明這封信未被修改過。

JB的測試之旅-IOS證書及簽名

10)複雜的情況出現了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。此時,蘇珊實際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃,用自己的私鑰做成"數字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進行解密。

JB的測試之旅-IOS證書及簽名

11)後來,蘇珊感覺不對勁,發現自己無法確定公鑰是否真的屬於鮑勃。她想到了一個辦法,要求鮑勃去找"證書中心"(certificate authority,簡稱CA),為公鑰做認證。證書中心用自己的私鑰,對鮑勃的公鑰和一些相關資訊一起加密,生成"數字證書"(Digital Certificate)。

JB的測試之旅-IOS證書及簽名

12)鮑勃拿到數字證書以後,就可以放心了。以後再給蘇珊寫信,只要在簽名的同時,再附上數字證書就行了。

JB的測試之旅-IOS證書及簽名

13)蘇珊收信後,用CA的公鑰解開數字證書,就可以拿到鮑勃真實的公鑰了,然後就能證明"數字簽名"是否真的是鮑勃籤的。

JB的測試之旅-IOS證書及簽名

正文看完下來,對數字簽名以及數字證書有了初步認識了= =

證書資訊

科普

1)蘋果開發者中心網站
2)開發者帳號的型別:
個人-$99(約688元/年)(除錯證書最多隻能有兩個)
公司-$99(約688元/年)需要提供鄧白氏編碼,用於企業認證,可以進行團隊開發管理
企業-$299,需要提供鄧白氏編碼,程式不能上架到AppStore(用於企業內部辦公軟體等)(除錯證書最多有五個)

建立證書

1)新增證書

JB的測試之旅-IOS證書及簽名

2)選擇證書

  • 開發證書(Development):最多1個(20170425日只能生成一個了)
  • 釋出證書(Production):最多3個
    JB的測試之旅-IOS證書及簽名

3)準備建立CSR檔案

JB的測試之旅-IOS證書及簽名

4)建立CSR檔案01(開啟鑰匙串->證書助理->從證書頒發機構請求證書)

JB的測試之旅-IOS證書及簽名

5)建立CSR檔案02(填寫電子郵件地址,常用名稱,這兩項都可以隨便填,注意要把CSR檔案儲存到磁碟)

JB的測試之旅-IOS證書及簽名

6)建立CSR檔案

JB的測試之旅-IOS證書及簽名

7)選擇剛剛建立的CSR檔案

JB的測試之旅-IOS證書及簽名

8)建立證書完畢,下載證書

JB的測試之旅-IOS證書及簽名

iOS 的簽名證書機制

AppStore

從 AppStore 下載的應用驗證流程非常簡單,蘋果官方身材一對公私鑰,在ios裡內建一個公鑰,私鑰由蘋果後臺儲存,當傳 App 上 AppStore 時,蘋果後臺用私鑰對 APP 資料進行簽名,iOS 系統下載這個 APP 後,用公鑰驗證這個簽名,若簽名正確,這個 APP 肯定是由蘋果後臺認證的,並且沒有被修改過,也就達到了蘋果的需求:保證安裝的每一個 APP 都是經過蘋果官方允許的。

JB的測試之旅-IOS證書及簽名

Xcode Build

那日常開發中,總沒可能每次都提交到App Store的,所以在本地除錯時,裝置會把對APP的驗證,改成對開發者的驗證;

JB的測試之旅-IOS證書及簽名

此處的開發者賬號,就是在 Apple Developer Center 中所申請的開發者賬號,一旦信任之後,每次 build 的時候,iOS 裝置就將驗證該開發者身份,而不是驗證你 build 的 App。如此一來,便省去了應用包上傳、下載的過程。我們知道,驗證 App 是通過簽名機制,來確定安裝包來源的,而此處的驗證開發者身份,又是怎樣的機制呢?

驗證開發者

首先,iOS 裝置需要驗證你的開發者身份,這是基於 macOS 的一種證書策略,如果開啟鑰匙串訪問,選中證書,我們可以看到這樣的一堆東西:

JB的測試之旅-IOS證書及簽名

在這裡能看到各種各樣的證書;
當在 Xcode 新增自己的賬號後,並在專案中將 Team 選擇為自己的開發者賬號後,鑰匙串中就多出了這麼一個東西:

JB的測試之旅-IOS證書及簽名
證書中儲存著一個“專用金鑰”,這個專用金鑰,是用來給 App 安裝包進行簽名的。
這份金鑰在生成的時候,Xcode 將金鑰的公鑰部分上傳至 Apple 伺服器,由 Apple 進行簽名生成證書,最後返回到本地,而私鑰,則會在 Xcode 本地構建安裝時,用來為 App 安裝包簽名。最後,Xcode 會將簽名後的安裝包和本地證書打包都放到 iOS 裝置中,iOS 裝置接著使用 Apple 公鑰來解密證書,拿到本地公鑰,接著用本地公鑰去解密 App 。

其實,也就2個事情:

  • iOS 裝置用 Apple 公鑰解密證書,所拿到的本地證書,必定是經過 Apple 伺服器簽名的,也就是說,這裡保證了開發者是經過蘋果認證的。
  • 上一步拿到的公鑰,用於解密 App 簽名,若解密成功且驗證通過,證明該 App 確實是由該開發者構建的,也就保證了 App 的安全性。

上述的流程唯一問題是,這個金鑰是在本地生成的,如果更換了電腦,本地的金鑰對就會改變。這時候,你需要將舊 mac 上的證書匯出,並安裝到新的電腦上。

小結

本文主要介紹了簽名跟證書的只是,包括對稱加密跟非對稱加密,以及數字證書相關資訊,並且介紹了App Store跟xcode的證書邏輯,從大致上對IOS證書這塊起到掃盲的作用,具體細節就不再深入了,大致就先這樣吧,後續需要再另寫一篇~

謝謝大家~

JB的測試之旅-IOS證書及簽名

相關文章