漫談iOS程式的證書和簽名機制

2021-09-08 11:33:40 字數 4388 閱讀 7598

6 天前 發布

原文:漫談ios程式的證書和簽名機制

接觸ios開發半年,曾經也被這個主題坑的摸不著頭腦,也在**上買過企業證書簽名這些服務,有大神都做了乙個全自動的發布打包(不過此大神現在不賣企業證書了),甚是羨慕和崇拜。於是,花了一點時間去研究了一下ios這套證書和簽名機制,並撰文分享給需要的朋友。由於本人才疏學淺,多有遺漏或錯誤之處,還請大神多多指教。

非對稱加密演算法可能是世界上最重要的演算法,它是當今電子商務等領域的基石。簡而言之,非對稱加密就是指加密金鑰和解密金鑰是不同的,而且加密金鑰和解密金鑰是成對出現。非對稱加密又叫公鑰加密,也就是說成對的金鑰,其中乙個是對外公開的,所有人都可以獲得,稱為公鑰,而與之相對應的稱為私鑰,只有這對金鑰的生成者才能擁有。公私鑰具有以下重要特性:

由於上述特性,非對稱加密具有以下的典型用法:

著名的rsa演算法就是非對稱加密演算法,rsa以三個發明人的首字母命名。

非對稱加密演算法如此強大可靠,卻有乙個弊端,就是加解密比較耗時。因此,在實際使用中,往往與對稱加密和摘要演算法結合使用。對稱加密很好理解,此處略過1w字。我們再來看一下摘要演算法。

另乙個神奇的演算法就是摘要演算法。摘要演算法是指,可以將任意長度的文字,通過乙個演算法,得到乙個固定長度的文字。這裡文字不一定只是文字,可以是位元組資料。所以摘要演算法試圖將世間萬物,變成乙個固定長度的東西。摘要演算法具有以下重要特性:

典型的摘要演算法,比如大名鼎鼎的md5sha。摘要演算法主要用於比對資訊源是否一致,因為只要源發生變化,得到的摘要必然不同;而且通常結果要比源短很多,所以稱為「摘要」。

理解了非對稱加密和摘要演算法,來看一下數字簽名。實際上數字簽名就是兩者結合。假設,我們有一段授權文字,需要發布,為了防止中途篡改文字內容,保證文字的完整性,以及文字是由指定的許可權狗發的。首先,先將文字內容通過摘要演算法,得到摘要,再用許可權狗的私鑰對摘要進行加密得到密文,將源文字、密文、和私鑰對應的公鑰一併發布即可。那麼如何驗證呢?

驗證方首先檢視公鑰是否是許可權狗的,然後用公鑰對密文進行解密得到摘要,將文字用同樣的摘要演算法得到摘要,兩個摘要進行比對,如果相等那麼一切正常。這個過程只要有一步出問題就視為無效。

數字簽名可以快速驗證文字的完整性和合法性,已廣泛應用於各個領域。理解了數字簽名以後,我們進一步來看什麼是數字證書。

證書顧名思義,就是許可權機構的頒發的證明。比如英語6級證書,就是教育部門頒發給通過了6級考核的個人的證明,證明這個人的英語能力。我們來看一下這個證書的組成:

於是老王就可以用這張證書找工作了,用人單位會通過檢視證書的各項內容(尤其是公章),來驗證證書的合法性和老王的能力。

在現實生活中,經常有假的6級證書,這些假證書最重要的就是有乙個假公章。現實生活中使用法律法規來約束私刻假公章的行為,但是用人單位可能不能十分準確的判斷公章是真是假。而這些問題在數字簽名面前都可以用數學的方法嚴謹的解決。

實際上,數字證書就是通過數字簽名實現的數位化的證書。在一般的證書組成部分中,還加入了其他的資訊,比如證書有效期(好比駕駛證初次申領後6年有效),過了有效期,需要重新簽發(駕駛證6年有效後需重新申領)。

跟現實生活中的簽發機構一樣,數字證書的簽發機構也有若干,並有不同的用處。比如蘋果公司就可以簽發跟蘋果公司有關的證書,而跟web訪問有關的證書則是又幾家公認的機構進行簽發。這些簽發機構稱為ca(certificate authority)。

對於被簽發人,通常都是企業或開發者。比如需要搭建基於ssl的**,那麼需要從幾家國際公認的ca去申請證書;再比如需要開發ios的應用程式,需要從蘋果公司獲得相關的證書。這些申請通常是企業或者開發者個人提交給ca的。當然申請所需要的材料、資質和費用都各不相同,是由這些ca制定的,比如蘋果要求$99或者$299的費用。

之所以要申請證書,當然是為了被驗證。英語6級證書的驗證方一般是用人單位;web應用相關的ssl證書的驗證方通常是瀏覽器;ios各種證書的驗證方是ios裝置。我們之所以必須從ca處申請證書,就是因為ca已經將整個驗證過程規定好了。對於ios,ios系統已經將這個驗證過程固化在系統中了,除非越獄,否則無法繞過。

數字證書可能還包括證書鏈資訊。舉個例子:如果你要申請休假1周,需要你的上司審批,你的上司需要他的上司同意,最終需要大老闆同意,那麼這一層層的授權,形成了乙個授權鏈,大老闆是授權鏈的根(root),中間這些環節分別是被更接近root的人授權的。

在繼續下去之前,先來看一張圖。

這張圖闡述了,開發ios應用程式時,從申請證書,到打包的大致過程。接下來我將對圖中的每乙個環節進行分析。

支付$99或$299成為蘋果開發者,並每年續費。這一步是蘋果的強制規定,相當於霸王條款,沒錢玩尼瑪!大家都知道$99針對個人和小企業,$299針對大企業,這麼分沒錯,不過你需要知道的是,兩種金額的本質區別在於你可以獲得的證書型別不同,$99當然比$299的少一些。

安裝蘋果開發者根證書,此證書實際上是我們從蘋果mc中申請的所有證書的「根證書」,安裝這個證書意味著我們的開發工具對此ca的信任,從而可以用此ca簽發的其他證書進行簽名和打包。一般而言,如果安裝了xcode,那麼這個證書是自動安裝在key chain中了。證書如下圖

然後,我們就開始按照很多**並茂的教程開始申請證書,各種操作。這裡由於是講原理,不展開這部分。我們來看每一步到底意味著什麼。

我們需要生成乙個certificatesigningrequest.certsigningrequest檔案來提交到mc中,從而獲取某種證書。那麼這個檔案到底是什麼呢?從上面的流程圖中大家可以看到,這個檔案包含兩部分內容(certificate signing request):

申請者資訊,此資訊是用申請者的私鑰加密的

申請者公鑰,此資訊是申請者使用的私鑰對應的公鑰

摘要演算法和公鑰加密演算法

我們可以用openssl來解析檔案中的內容一窺究竟:

openssl asn1parse -i -in certificatesigningrequest.certsigningrequest

0:d=0 hl=4 l= 649 cons: sequence 4:d=1 hl=4 l= 369 cons: sequence 8:d=2 hl=2 l= 1 prim: integer :00 11:d=2 hl=2 l= 68 cons: sequence 13:d=3 hl=2 l= 36 cons: set 15:d=4 hl=2 l= 34 cons: sequence 17:d=5 hl=2 l= 9 prim: object :emailaddress 28:d=5 hl=2 l= 21 prim: ia5string :[email protected] 51:d=3 hl=2 l= 15 cons: set 53:d=4 hl=2 l= 13 cons: sequence 55:d=5 hl=2 l= 3 prim: object :commonname 60:d=5 hl=2 l= 6 prim: utf8string :parker 68:d=3 hl=2 l= 11 cons: set 70:d=4 hl=2 l= 9 cons: sequence 72:d=5 hl=2 l= 3 prim: object :countryname 77:d=5 hl=2 l= 2 prim: printablestring :cn 81:d=2 hl=4 l= 290 cons: sequence 85:d=3 hl=2 l= 13 cons: sequence 87:d=4 hl=2 l= 9 prim: object :rsaencryption 98:d=4 hl=2 l= 0 prim: null 100:d=3 hl=4 l= 271 prim: bit string 375:d=2 hl=2 l= 0 cons: cont [ 0 ] 377:d=1 hl=2 l= 13 cons: sequence 379:d=2 hl=2 l= 9 prim: object :sha1withrsaencryption 390:d=2 hl=2 l= 0 prim: null 392:d=1 hl=4 l= 257 prim: bit string

可以看到檔案包含了我的資訊,並標明使用了sha1摘要演算法和rsa公鑰加密演算法。蘋果的mc在拿到這個後,將這個資訊記錄下來,並簽發出相關的證書。這裡,蘋果實際無需驗證我的資訊,因為如果我不交錢就沒辦法上傳這個檔案,也就得不到證書。

蘋果取出certificatesigningrequest.certsigningrequest中的公鑰,根本不管我的其他資訊,然後將我的mc賬號資訊和我提交的公鑰封裝在證書中,並進行數字簽名。以開發證書為例,我們用openssl來看一下證書的內容:

openssl x509 -inform der -in ios_development.cer -noout -text

certificate:

data:

version: 3 (0x2)

serial number:

iOS 簽名機制與證書

純粹就是總結,很多地方跟參考資料一樣,就是自己手動打一遍,自己親自畫個圖增加理解和加強記憶力,而不只是複製貼上 ios 打包流程也不在此敘述,相信很多人已經對照過各種 並茂的文章一一操作過 即加密金鑰與解密金鑰不同,且成對出現 對外公開的稱為公鑰,這對金鑰生成者才擁有的稱為私鑰 通過私鑰加密的密文只...

iOS簽名機制與證書介紹

純粹就是總結,很多地方跟參考資料一樣,就是自己手動打一遍,自己親自畫個圖增加理解和加強記憶力,而不只是複製貼上 ios 打包流程也不在此敘述,相信很多人已經對照過各種 並茂的文章一一操作過 即加密金鑰與解密金鑰不同,且成對出現 對外公開的稱為公鑰,這對金鑰生成者才擁有的稱為私鑰 通過私鑰加密的密文只...

ios簽名機制的理解

一 非對稱演算法和數字簽名 區別之前的對稱加密演算法 加密解密用的是同乙個秘鑰 非對稱加密演算法需要兩個秘鑰,即公鑰和私鑰來進行加密和解密,它倆是成對出現的,如果用公鑰加密的內容,只有對應的私鑰才能解密,反之,用私鑰加密的內容,只有對應的公鑰才能解密。相對於對稱演算法,該演算法安全性高,只要私鑰不洩...