国产亚洲欧美人成在线,免费视频爱爱太爽了无码,日本免费一区二区三区高清视频 ,国产真实伦对白精彩视频

歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
電話圖標(biāo) 余先生:13699882642

網(wǎng)站百科

為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

iOS程序的證書和簽名機(jī)制

發(fā)表日期:2017-11 文章編輯:小燈 瀏覽次數(shù):2269

接觸iOS開發(fā)多年,花了一點(diǎn)時(shí)間去研究了一下iOS這套證書和簽名機(jī)制,并撰文分享給需要的朋友。由于本人才疏學(xué)淺,多有遺漏或錯(cuò)誤之處,還請(qǐng)大神多多指教。

非對(duì)稱加密和摘要

非對(duì)稱加密的特性和用法

非對(duì)稱加密算法可能是世界上最重要的算法,它是當(dāng)今電子商務(wù)等領(lǐng)域的基石。簡而言之,非對(duì)稱加密就是指加密密鑰和解密密鑰是不同的,而且加密密鑰和解密密鑰是成對(duì)出現(xiàn)。非對(duì)稱加密又叫公鑰加密,也就是說成對(duì)的密鑰,其中一個(gè)是對(duì)外公開的,所有人都可以獲得,稱為公鑰,而與之相對(duì)應(yīng)的稱為私鑰,只有這對(duì)密鑰的生成者才能擁有。公私鑰具有以下重要特性:

對(duì)于一個(gè)私鑰,有且只有一個(gè)與之對(duì)應(yīng)的公鑰。生成者負(fù)責(zé)生成私鑰和公鑰,并保存私鑰,公開公鑰

公鑰是公開的,但不可能通過公鑰反推出私鑰,或者說極難反推,只能窮舉,所以只要密鑰足夠長度,要通過窮舉而得到私鑰,幾乎是不可能的

通過私鑰加密的密文只能通過公鑰解密,公鑰加密的密文只有通過私鑰解密

由于上述特性,非對(duì)稱加密具有以下的典型用法:

對(duì)信息保密,防止中間人攻擊:將明文通過接收人的公鑰加密,傳輸給接收人,因?yàn)橹挥薪邮杖藫碛袑?duì)應(yīng)的私鑰,別人不可能擁有或者不可能通過公鑰推算出私鑰,所以傳輸過程中無法被中間人截獲。只有擁有私鑰的接收人才能閱讀。此用法通常用于交換對(duì)稱密鑰。

身份驗(yàn)證和防止篡改:權(quán)限狗用自己的私鑰加密一段授權(quán)明文,并將授權(quán)明文和加密后的密文,以及公鑰一并發(fā)送出來,接收方只需要通過公鑰將密文解密后與授權(quán)明文對(duì)比是否一致,就可以判斷明文在中途是否被篡改過。此方法用于數(shù)字簽名。

著名的RSA算法就是非對(duì)稱加密算法,RSA以三個(gè)發(fā)明人的首字母命名。

非對(duì)稱加密算法如此強(qiáng)大可靠,卻有一個(gè)弊端,就是加解密比較耗時(shí)。因此,在實(shí)際使用中,往往與對(duì)稱加密和摘要算法結(jié)合使用。對(duì)稱加密很好理解,此處略過1w字。我們?cè)賮砜匆幌抡惴ā?/p>

摘要算法

另一個(gè)神奇的算法就是摘要算法。摘要算法是指,可以將任意長度的文本,通過一個(gè)算法,得到一個(gè)固定長度的文本。這里文本不一定只是文本,可以是字節(jié)數(shù)據(jù)。所以摘要算法試圖將世間萬物,變成一個(gè)固定長度的東西。摘要算法具有以下重要特性:

只要源文本不同,計(jì)算得到的結(jié)果,必然不同

無法從結(jié)果反推出源(那是當(dāng)然的,不然就能量不守恒了)

典型的摘要算法,比如大名鼎鼎的MD5和SHA。摘要算法主要用于比對(duì)信息源是否一致,因?yàn)橹灰窗l(fā)生變化,得到的摘要必然不同;而且通常結(jié)果要比源短很多,所以稱為“摘要”。

數(shù)字簽名

理解了非對(duì)稱加密和摘要算法,來看一下數(shù)字簽名。實(shí)際上數(shù)字簽名就是兩者結(jié)合。假設(shè),我們有一段授權(quán)文本,需要發(fā)布,為了防止中途篡改文本內(nèi)容,保證文本的完整性,以及文本是由指定的權(quán)限狗發(fā)的。首先,先將文本內(nèi)容通過摘要算法,得到摘要,再用權(quán)限狗的私鑰對(duì)摘要進(jìn)行加密得到密文,將源文本、密文、和私鑰對(duì)應(yīng)的公鑰一并發(fā)布即可。那么如何驗(yàn)證呢?

驗(yàn)證方首先查看公鑰是否是權(quán)限狗的,然后用公鑰對(duì)密文進(jìn)行解密得到摘要,將文本用同樣的摘要算法得到摘要,兩個(gè)摘要進(jìn)行比對(duì),如果相等那么一切正常。這個(gè)過程只要有一步出問題就視為無效。

數(shù)字簽名可以快速驗(yàn)證文本的完整性和合法性,已廣泛應(yīng)用于各個(gè)領(lǐng)域。理解了數(shù)字簽名以后,我們進(jìn)一步來看什么是數(shù)字證書。

數(shù)字證書

現(xiàn)實(shí)生活的證書

證書顧名思義,就是權(quán)限機(jī)構(gòu)的頒發(fā)的證明。比如英語6級(jí)證書,就是教育部門頒發(fā)給通過了6級(jí)考核的個(gè)人的證明,證明這個(gè)人的英語能力。我們來看一下這個(gè)證書的組成:

被證明人:老王

內(nèi)容:通過了英語六級(jí)

蓋章:教育部門的公章或鋼印

于是老王就可以用這張證書找工作了,用人單位會(huì)通過查看證書的各項(xiàng)內(nèi)容(尤其是公章),來驗(yàn)證證書的合法性和老王的能力。

在現(xiàn)實(shí)生活中,經(jīng)常有假的6級(jí)證書,這些假證書最重要的就是有一個(gè)假公章。現(xiàn)實(shí)生活中使用法律法規(guī)來約束私刻假公章的行為,但是用人單位可能不能十分準(zhǔn)確的判斷公章是真是假。而這些問題在數(shù)字簽名面前都可以用數(shù)學(xué)的方法嚴(yán)謹(jǐn)?shù)慕鉀Q。

數(shù)字證書:用數(shù)字簽名實(shí)現(xiàn)的證書

實(shí)際上,數(shù)字證書就是通過數(shù)字簽名實(shí)現(xiàn)的數(shù)字化的證書。在一般的證書組成部分中,還加入了其他的信息,比如證書有效期(好比駕駛證初次申領(lǐng)后6年有效),過了有效期,需要重新簽發(fā)(駕駛證6年有效后需重新申領(lǐng))。

跟現(xiàn)實(shí)生活中的簽發(fā)機(jī)構(gòu)一樣,數(shù)字證書的簽發(fā)機(jī)構(gòu)也有若干,并有不同的用處。比如蘋果公司就可以簽發(fā)跟蘋果公司有關(guān)的證書,而跟web訪問有關(guān)的證書則是又幾家公認(rèn)的機(jī)構(gòu)進(jìn)行簽發(fā)。這些簽發(fā)機(jī)構(gòu)稱為CA(Certificate Authority)。

對(duì)于被簽發(fā)人,通常都是企業(yè)或開發(fā)者。比如需要搭建基于SSL的網(wǎng)站,那么需要從幾家國際公認(rèn)的CA去申請(qǐng)證書;再比如需要開發(fā)iOS的應(yīng)用程序,需要從蘋果公司獲得相關(guān)的證書。這些申請(qǐng)通常是企業(yè)或者開發(fā)者個(gè)人提交給CA的。當(dāng)然申請(qǐng)所需要的材料、資質(zhì)和費(fèi)用都各不相同,是由這些CA制定的,比如蘋果要求$99或者$299的費(fèi)用。

之所以要申請(qǐng)證書,當(dāng)然是為了被驗(yàn)證。英語6級(jí)證書的驗(yàn)證方一般是用人單位;web應(yīng)用相關(guān)的SSL證書的驗(yàn)證方通常是瀏覽器;iOS各種證書的驗(yàn)證方是iOS設(shè)備。我們之所以必須從CA處申請(qǐng)證書,就是因?yàn)镃A已經(jīng)將整個(gè)驗(yàn)證過程規(guī)定好了。對(duì)于iOS,iOS系統(tǒng)已經(jīng)將這個(gè)驗(yàn)證過程固化在系統(tǒng)中了,除非越獄,否則無法繞過。

證書的授權(quán)鏈

數(shù)字證書可能還包括證書鏈信息。舉個(gè)例子:如果你要申請(qǐng)休假1周,需要你的上司審批,你的上司需要他的上司同意,最終需要大老板同意,那么這一層層的授權(quán),形成了一個(gè)授權(quán)鏈,大老板是授權(quán)鏈的根(root),中間這些環(huán)節(jié)分別是被更接近root的人授權(quán)的。

我們從蘋果MC(Member Center)中獲得的證書實(shí)際也是一個(gè)包含有證書鏈的證書,其中的根是蘋果的CA。我們獲得的證書實(shí)際上是在告訴iOS設(shè)備:我們的證書是被蘋果CA簽過名的合法的證書。而iOS設(shè)備在執(zhí)行app前,首先要先驗(yàn)證CA的簽名是否合法,然后再通過證書中我們的公鑰驗(yàn)證程序是否的確是我們發(fā)布的,且中途沒有對(duì)程序進(jìn)行過篡改。

iOS證書申請(qǐng)和簽名打包流程圖

在繼續(xù)下去之前,先來看一張圖。

這張圖闡述了,開發(fā)iOS應(yīng)用程序時(shí),從申請(qǐng)證書,到打包的大致過程。接下來我將對(duì)圖中的每一個(gè)環(huán)節(jié)進(jìn)行分析。

證書申請(qǐng)

開發(fā)iOS程序,必然要進(jìn)行的工作就是成為開發(fā)者,并申請(qǐng)相關(guān)的證書,否則你的程序只能在模擬器上運(yùn)行,無法在真機(jī)上調(diào)試,更不要說上架了。那么在申請(qǐng)證書之前需要:

支付$99或$299成為蘋果開發(fā)者,并每年續(xù)費(fèi)。這一步是蘋果的強(qiáng)制規(guī)定,相當(dāng)于霸王條款,沒錢玩尼瑪!大家都知道$99針對(duì)個(gè)人和小企業(yè),$299針對(duì)大企業(yè),這么分沒錯(cuò),不過你需要知道的是,兩種金額的本質(zhì)區(qū)別在于你可以獲得的證書類型不同,$99當(dāng)然比$299的少一些。

安裝蘋果開發(fā)者根證書,此證書實(shí)際上是我們從蘋果MC中申請(qǐng)的所有證書的“根證書”,安裝這個(gè)證書意味著我們的開發(fā)工具對(duì)此CA的信任,從而可以用此CA簽發(fā)的其他證書進(jìn)行簽名和打包。一般而言,如果安裝了Xcode,那么這個(gè)證書是自動(dòng)安裝在Key Chain中了。證書如下圖

然后,我們就開始按照很多圖文并茂的教程開始申請(qǐng)證書,各種操作。這里由于是講原理,不展開這部分。我們來看每一步到底意味著什么。

什么是CertificateSigningRequest.certSigningRequest

我們需要生成一個(gè)CertificateSigningRequest.certSigningRequest文件來提交到MC中,從而獲取某種證書。那么這個(gè)文件到底是什么呢?從上面的流程圖中大家可以看到,這個(gè)文件包含兩部分內(nèi)容(Certificate signing request):

申請(qǐng)者信息,此信息是用申請(qǐng)者的私鑰加密的

申請(qǐng)者公鑰,此信息是申請(qǐng)者使用的私鑰對(duì)應(yīng)的公鑰

摘要算法和公鑰加密算法

我們可以用openssl來解析文件中的內(nèi)容一窺究竟:

openssl asn1parse -i -inCertificateSigningRequest.certSigningRequest0:d=0? hl=4 l=649cons:SEQUENCE4:d=1? hl=4 l=369cons:SEQUENCE8:d=2? hl=2 l=1prim:INTEGER:0011:d=2? hl=2 l=68cons:SEQUENCE13:d=3? hl=2 l=36cons:SET15:d=4? hl=2 l=34cons:SEQUENCE17:d=5? hl=2 l=9prim:OBJECT:emailAddress28:d=5? hl=2 l=21prim:IA5STRING:zhoupingtkbjb@163.com51:d=3? hl=2 l=15cons:SET53:d=4? hl=2 l=13cons:SEQUENCE55:d=5? hl=2 l=3prim:OBJECT:commonName60:d=5? hl=2 l=6prim:UTF8STRING:Parker68:d=3? hl=2 l=11cons:SET70:d=4? hl=2 l=9cons:SEQUENCE72:d=5? hl=2 l=3prim:OBJECT:countryName77:d=5? hl=2 l=2prim:PRINTABLESTRING:CN81:d=2? hl=4 l=290cons:SEQUENCE85:d=3? hl=2 l=13cons:SEQUENCE87:d=4? hl=2 l=9prim:OBJECT:rsaEncryption98:d=4? hl=2 l=0prim:NULL100:d=3? hl=4 l=271prim:BITSTRING375:d=2? hl=2 l=0cons:?cont [0 ]377:d=1? hl=2 l=13cons:SEQUENCE379:d=2? hl=2 l=9prim:OBJECT:sha1WithRSAEncryption390:d=2? hl=2 l=0prim:NULL392:d=1? hl=4 l=257prim:BITSTRING

可以看到文件包含了我的信息,并標(biāo)明使用了sha1摘要算法和RSA公鑰加密算法。蘋果的MC在拿到這個(gè)后,將這個(gè)信息記錄下來,并簽發(fā)出相關(guān)的證書。這里,蘋果實(shí)際無需驗(yàn)證我的信息,因?yàn)槿绻也唤诲X就沒辦法上傳這個(gè)文件,也就得不到證書。

從MC中申請(qǐng)到的證書究竟是什么

蘋果取出CertificateSigningRequest.certSigningRequest中的公鑰,根本不管我的其他信息,然后將我的MC賬號(hào)信息和我提交的公鑰封裝在證書中,并進(jìn)行數(shù)字簽名。以開發(fā)證書為例,我們用openssl來看一下證書的內(nèi)容:

openssl x509 -inform der -in ios_development.cer -noout -textCertificate:? ? Data:? ? ? ? Version:3 (0x2)? ? ? ? Serial Number:65:97:cd:73:6f:19:37:c2? ? ? ? Signature Algorithm: sha256WithRSAEncryption? ? ? ? Issuer: C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority? ? ? ? Validity? ? ? ? ? ? Not Before: Jul2907:36:282015 GMT? ? ? ? ? ? Not After : Jul2807:36:282016 GMT? ? ? ? Subject: UID=8VPWB57FDW, CN=iPhone Developer:LiangDing(2U967A2YJ6), OU=7XPNRZE9TC, O=Liang Ding, C=US? ? ? ? Subject Public Key Info:? ? ? ? ? ? Public Key Algorithm: rsaEncryption? ? ? ? ? ? RSA Public Key: (2048 bit)? ? ? ? ? ? ? ? Modulus (2048 bit):00:ab:43:a4:57:32:57:30:81:89:eb:b4:5c:b6:88:7f:4f:59:3a:9e:f6:14:50:2c:5c:14:6d:01:58:bd:? ? ? ? ? ? ? ? ? ? d7:2b:a6:66:71:f7:d9:da:58:a2:e8:4c:d5:a9:87:20:5b:b7:4c:58:29:3c:b3:48:de:7f:ad:3f:98:cc:9d:b3:07:2f:93:4a:3a:e5:32:e2:fc:59:30:1e:ee:65:11:c3:88:ea:7a:54:d8:60:56:d1:fa:69:06:40:? ? ? ? ? ? ? ? ? ? dd:72:1d:7f:d9:14:85:bf:7a:b0:a3:34:a0:ac:c1:? ? ? ? ? ? ? ? ? ? dc:a9:48:3c:9c:43:c8:e4:fd:02:eb:fe:d2:a7:ce:2e:e4:9a:51:20:0b:5b:e5:5a:d4:04:9e:a4:52:8d:? ? ? ? ? ? ? ? ? ? c2:1e:1f:50:80:fb:ea:c1:e4:bb:b4:ec:35:fd:96:6a:86:0a:62:fa:d2:5a:8b:34:1b:f2:c5:c8:c9:2c:85:d1:4d:8c:cb:91:be:db:92:f0:88:37:7a:6d:8d:? ? ? ? ? ? ? ? ? ? ef:c6:e1:47:5c:e5:ca:e2:5a:47:14:5d:2f:5b:2e:? ? ? ? ? ? ? ? ? ? d4:df:61:d9:99:e2:3e:6b:24:b2:aa:36:b3:af:e6:? ? ? ? ? ? ? ? ? ? a8:a8:28:a7:8a:73:aa:68:a9:71:ac:81:a8:20:98:? ? ? ? ? ? ? ? ? ? bb:3e:76:e2:09:19:41:45:d7:9a:68:1b:7c:1d:f5:? ? ? ? ? ? ? ? ? ? b2:0b:36:ac:f0:4b:fc:0a:f1:3c:de:96:a0:10:14:? ? ? ? ? ? ? ? ? ? aa:79? ? ? ? ? ? ? ? Exponent:65537 (0x10001)? ? ? ? X509v3 extensions:? ? ? ? ? ? Authority Information Access:? ? ? ? ? ? ? ?OCSP - URI:http://ocsp.apple.com/ocsp03-wwdr01? ? ? ? ? ? X509v3 Subject Key Identifier:? ? ? ? ? ? ? ?C7:AB:35:54:A3:7B:96:2A:67:55:B8:2F:B6:82:4B:B8:F0:49:0F:EB? ? ? ? ? ? X509v3 Basic Constraints: critical? ? ? ? ? ? ? ? CA:FALSE? ? ? ? ? ? X509v3 Authority Key Identifier:? ? ? ? ? ? ? ?keyid:88:27:17:09:A9:B6:18:60:8B:EC:EB:BA:F6:47:59:C5:52:54:A3:B7? ? ? ? ? ? X509v3 Certificate Policies:? ? ? ? ? ? ? ?Policy:1.2.840.113635.100.5.1? ? ? ? ? ? ? ? ? User Notice:? ? ? ? ? ? ? ? ? ? Explicit Text: Reliance onthis certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.? ? ? ? ? ? ? ? ? CPS: http://www.apple.com/certificateauthority/? ? ? ? ? ? X509v3 Key Usage: critical? ? ? ? ? ? ? ? Digital Signature? ? ? ? ? ? X509v3 Extended Key Usage: critical? ? ? ? ? ? ? ? Code Signing1.2.840.113635.100.6.1.2: critical? ? ? ? ? ? ? ? ..? ? Signature Algorithm: sha256WithRSAEncryption80:99:47:27:ae:e5:1e:89:1e:c2:ec:52:d7:c8:8b:df:86:25:? ? ? ? a9:cb:b2:f2:01:6c:5e:a0:55:6c:ad:1d:bd:3b:1c:ce:b4:53:4d:03:d0:98:f6:f7:0e:24:2b:c5:cb:5e:71:88:bd:53:46:a8:? ? ? ? c7:e0:d9:f4:81:47:98:a5:91:5c:04:f6:df:b9:c2:06:64:a4:73:3d:0b:78:0d:8b:11:29:d3:3a:ea:88:b7:97:a9:2a:e0:74:? ? ? ? a9:0b:1f:91:0f:47:78:be:90:46:21:10:16:a5:4b:0d:a6:33:7e:0c:18:95:ba:7c:8e:b5:ed:86:5f:73:1b:cb:9e:ae:c8:96:9d:4f:12:0a:9b:43:cc:58:ca:f3:d5:f0:6e:19:a6:e9:bf:9d:95:34:39:4d:86:34:46:7e:11:e7:7c:9f:7b:1d:b1:9c:7d:1b:39:85:5f:77:b0:89:d4:bb:55:c3:a9:24:af:54:a6:42:47:bf:7c:d3:b0:6f:af:6a:2e:c6:00:07:1c:de:6b:aa:5b:a6:23:2b:? ? ? ? fb:cd:2b:eb:04:fb:19:3e:1d:9d:ca:ae:d4:20:f1:4d:63:10:44:80:d1:cf:fd:82:51:d2:cd:77:cb:46:1e:bd:63:df:4f:82:? ? ? ? c7:5d:b3:61:45:03:6b:84:35:17:4b:c6:16:f0:47:1f:7b:26:62:e3:d1:1b

Data域即為證書的實(shí)際內(nèi)容,與Data域平級(jí)的Signature Algorithm實(shí)際就是蘋果的CA的公鑰,而摘要的簽名應(yīng)該沒有顯示出來。Data域下一級(jí)的內(nèi)容就是我的蘋果賬號(hào)信息,其中最為重要的是我的公鑰,這個(gè)公鑰與我本機(jī)的私鑰是對(duì)應(yīng)的。當(dāng)我們雙擊安裝完證書后,KeyChain會(huì)自動(dòng)將這對(duì)密鑰關(guān)聯(lián)起來,所以在KeyChain中可以看到類似的效果:

后續(xù)在程序上真機(jī)的過程中,會(huì)使用這個(gè)私鑰,對(duì)代碼進(jìn)行簽名,而公鑰會(huì)附帶在mobileprovision文件中,打包進(jìn)app。

注意這里,公鑰是附帶在mobileprovision中的,并不是直接隨代碼打包的,所以,筆者認(rèn)為,本質(zhì)上在電腦上安裝證書是沒有實(shí)際用處的,因?yàn)閙obileprovision是MC為我們生成的。之所以需要安裝證書,是因?yàn)楹灻绦騝odesign或者Xcode,只能讓我們選擇“用哪個(gè)證書簽名”,因?yàn)槲覀兯x的證書還是會(huì)對(duì)應(yīng)到私鑰,真正用于簽名的是私鑰。mobileprovision和代碼簽名在后面詳細(xì)說明。

所以,就算你有證書,但是如果沒有對(duì)應(yīng)的私鑰是沒有用的。那么有人要問了,既然私鑰只有某臺(tái)電腦生成的,那么團(tuán)隊(duì)開發(fā)怎么展開呢?

團(tuán)隊(duì)開發(fā)

于是,大家會(huì)去搜索“iOS證書共享”之類的關(guān)鍵字,給出的解決方案就是“私鑰導(dǎo)出”。沒錯(cuò),既然問題的關(guān)鍵是私鑰,我們共享私鑰不就行了,將最初申請(qǐng)證書的機(jī)器的私鑰導(dǎo)出成.p12文件,并讓其他機(jī)器導(dǎo)入,同時(shí)其他機(jī)器也應(yīng)該安裝下載下來的證書。

當(dāng)然還有一種方案,就是每臺(tái)機(jī)器都各自去申請(qǐng)各自的證書。然而這樣做可能到后面比較混亂。

由于iOS證書有多種類型,用于不同的用處,所以我們可能后續(xù)還會(huì)去MC上申請(qǐng)別的證書。所以強(qiáng)烈建議CertificateSigningRequest.certSigningRequest需要保留,因?yàn)槿绻俅紊蒀ertificateSigningRequest.certSigningRequest文件,可能就是對(duì)應(yīng)另一個(gè)私鑰了!還需要在共享一次私鑰,會(huì)比較麻煩。

iOS證書類型

當(dāng)我們?cè)贛C的申請(qǐng)證書界面點(diǎn)擊新建證書時(shí),需要選擇一種證書。每種證書有不同的用處,就好比你要生孩子,那么得有準(zhǔn)生證;你要駕駛機(jī)動(dòng)車,需要駕駛證;你要出國,需要護(hù)照...那么在iOS開發(fā)中涉及的證書究竟有什么區(qū)別呢?本質(zhì)上他們的區(qū)別只是用途,從證書結(jié)構(gòu)上講都是同一個(gè),只要你不改變申請(qǐng)用的CertificateSigningRequest.certSigningRequest文件,這些證書中包含的公鑰和對(duì)應(yīng)的私鑰都是同一個(gè)。接下來羅列幾個(gè)常用的證書類型:

iOS App Development。開發(fā)、真機(jī)調(diào)試用

Apple Push Notification service SSL (Sandbox)。開發(fā)階段使用蘋果的推送服務(wù)

App Store and Ad Hoc。上架和AdHoc方式發(fā)布時(shí)用

Apple Push Notification service SSL (Production)。上架后使用蘋果推送服務(wù)

In-House。企業(yè)版發(fā)布,需$299才能擁有,還需鄧氏編碼

其他不常用的就不列舉了。關(guān)于AdHoc方式,在后面的mobileprovision中再說。

iOS授權(quán)和描述文件

但是光有證書并不夠解決蘋果的“后顧之憂”,證書能夠證明app的所屬以及app的完整性,保證app本身是安全的。但是,卻不能細(xì)化到app所使用的某些服務(wù)是被蘋果認(rèn)可的,比如APN推送服務(wù)。而且證書無法限制調(diào)試版的app的裝機(jī)規(guī)模。于是,蘋果想出了“花式作死”的mobileprovision。你可以使用如下命令查看一個(gè)mobileprovision:

security cms -D -i embedded.mobileprovision

mobileprovision文件包含:

AppId。每個(gè)app必須在MC中創(chuàng)建一個(gè)對(duì)應(yīng)的AppId。規(guī)則不累述了。

使用哪些證書。上面說了,不同類型的證書就代表了不同的發(fā)布方式,還包括一些功能的能否使用(比如APN)

功能授權(quán)列表

可安裝的設(shè)備列表。對(duì)于AdHoc方式發(fā)布的app或者真機(jī)調(diào)試時(shí),會(huì)有一個(gè)列表,這個(gè)列表里面是iOS設(shè)備的UDID,每臺(tái)iOS設(shè)備出廠的UDID都不同,所以可以用來標(biāo)識(shí)設(shè)備??赏ㄟ^iTunes連接設(shè)備,或者h(yuǎn)ttp://fir.im/udid這里獲取

蘋果的簽名!

注意5,這里的簽名是蘋果簽的,跟我們的私鑰沒有關(guān)系。也就是說mobileprovision文件是蘋果簽名的,我們除了從MC中獲取,別無他法。也不能再獲取后隨意篡改(比如添加別的設(shè)備)。因此上面的1-4就被蘋果牢牢的控制在手里,所有的規(guī)則都必須由蘋果來制定和約束。

AdHoc發(fā)布和真機(jī)調(diào)試

AdHoc允許將測(cè)試版app發(fā)布給有限的設(shè)備安裝,而無需通過appstore的審核。這里的關(guān)鍵是如何控制哪些設(shè)備可以裝。答案就是mobileprovision文件,記得你在生成mobileprovision文件的時(shí)候需要選設(shè)備的UDID吧,所以這些設(shè)備需要事先添加到MC的Devices里面。對(duì)于開發(fā)時(shí)候的真機(jī)調(diào)試,原理差不多。都是通過mobileprovision的條目4來做到的。而蘋果對(duì)于調(diào)試和測(cè)試用機(jī)的數(shù)量限制為100臺(tái)!

iOS代碼簽名

很多人研究到上面也就停止了,然而生命不息,作死不止。上面很多次提到代碼簽名,那么究竟代碼是如何簽名的。這對(duì)于可能需要做自動(dòng)簽名發(fā)布的企業(yè)或團(tuán)隊(duì)是必須了解的。另外,你可能還需要去閱讀iReSign的源碼。

ipa的組成

iOS程序最終都會(huì)以.ipa文件導(dǎo)出,先來了解一下ipa文件的結(jié)構(gòu):

事實(shí)上,ipa文件只是一個(gè)zip包,可以使用如下命令解壓:

/usr/bin/unzip -q xxx.ipa -d

解壓后,得到上圖的Payload目錄,下面是個(gè)子目錄,其中的內(nèi)容如下:

資源文件,例如圖片、html、等等。

_CodeSignature/CodeResources。這是一個(gè)plist文件,可用文本查看,其中的內(nèi)容就是是程序包中(不包括Frameworks)所有文件的簽名。注意這里是所有文件。意味著你的程序一旦簽名,就不能更改其中任何的東西,包括資源文件和可執(zhí)行文件本身。iOS系統(tǒng)會(huì)檢查這些簽名。

可執(zhí)行文件。此文件跟資源文件一樣需要簽名。

一個(gè)mobileprovision文件.打包的時(shí)候使用的,從MC上生成的。

Frameworks。程序引用的非系統(tǒng)自帶的Frameworks,每個(gè)Frameworks其實(shí)就是一個(gè)app,其中的結(jié)構(gòu)應(yīng)該和app差不多,也包含簽名信息CodeResources文件

相關(guān)的程序和命令

一般我們會(huì)用Xcode自帶的archive功能來打包ipa和簽名,實(shí)際上xcode只不過是調(diào)用了一些外部程序完成了工作,如果我們有朝一日需要自己實(shí)現(xiàn)自動(dòng)化的簽名流程,就需要了解究竟相關(guān)的程序和命令有哪些。

用下面命令,列出系統(tǒng)中可用于簽名的有效證書:

/usr/bin/security find-identity -v -p codesigning1) E056929276F94152F3FDF0EA84BD2B06396F2DDD"iPhone Developer: Liang Ding (2U967A2YJ6)"2)7C608F653A989E95E1A4D303EC4E6625D95EEB42"iPhone Distribution: Liang Ding (7XPNRZE9TC)"2 valid identities found

可以看到這個(gè)命令列出了一個(gè)字符串標(biāo)示的證書名稱,如:iPhone Developer: Liang Ding (2U967A2YJ6)。這個(gè)名稱后面會(huì)用到的。

使用如下命令對(duì)xxx.app目錄簽名,codesign程序會(huì)自動(dòng)將其中的文件都簽名,(Frameworks不會(huì)自動(dòng)簽):

/user/bin/codesign -fs"iPhone Developer: Liang Ding (2U967A2YJ6)" --no-strict Payload/xxx.app

對(duì)于每個(gè)Framework,也需要使用這個(gè)命令簽名,上面說了Framework的結(jié)構(gòu)跟app其實(shí)差不多,所以簽名命令類似。這個(gè)命令會(huì)自動(dòng)找到證書相關(guān)的私鑰。-f表示對(duì)于已經(jīng)簽名的app強(qiáng)制重簽。

最后用下面命令校驗(yàn)簽名是否合法:

/usr/bin/codesign -v xxx.app

如果沒有任何輸出說明沒有問題。

使用zip命令重新打包成ipa包

/usr/bin/zip -qry destinationsource

對(duì)app重新簽名的流程

如果要設(shè)計(jì)一個(gè)自動(dòng)化的重簽程序,大致需要這么個(gè)流程:

首先解壓ipa

如果mobileprovision需要替換,替換

如果存在Frameworks子目錄,則對(duì).app文件夾下的所有Frameworks進(jìn)行簽名,在Frameworks文件夾下的.dylib或.framework

對(duì)xxx.app簽名

重新打包

iOS設(shè)備如何驗(yàn)證app是否合法

關(guān)鍵的幾個(gè)點(diǎn):

解壓ipa

取出embedded.mobileprovision,通過簽名校驗(yàn)是否被篡改過

其中有幾個(gè)證書的公鑰,其中開發(fā)證書和發(fā)布證書用于校驗(yàn)簽名

BundleId

授權(quán)列表

校驗(yàn)所有文件的簽名,包括Frameworks

比對(duì)Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的

總結(jié)

非對(duì)稱密鑰算法是基石,本文比較詳細(xì)的闡述了非對(duì)稱加密算法和摘要算法,并逐漸引出數(shù)字簽名和數(shù)字證書。理解非對(duì)稱密鑰算法是關(guān)鍵。

蘋果通過證書來授權(quán)開發(fā)者開發(fā)iOS應(yīng)用,不同的證書具有不同的用處,建議申請(qǐng)時(shí)使用相同的請(qǐng)求文件(即保證私鑰統(tǒng)一)??梢酝ㄟ^共享私鑰的方式讓團(tuán)隊(duì)使用相同的私鑰和證書,已方便開發(fā)。為了保證app的安全性,app中所有的文件都會(huì)被簽名,這樣,簽過名的app除非重新簽名,否則無法改動(dòng)其中的任何東西。

mobileprovision是一個(gè)配置文件,由蘋果簽名并發(fā)布給開發(fā)者。配置文件是一組信息的集合,這組信息決定了某一個(gè)應(yīng)用是否能夠在某一個(gè)特定的設(shè)備上運(yùn)行。配置文件可以用于讓應(yīng)用在你的開發(fā)設(shè)備上可以被運(yùn)行和調(diào)試,也可以用于內(nèi)部測(cè)試 (ad-hoc) 或者企業(yè)級(jí)應(yīng)用的發(fā)布。有了配置文件,蘋果對(duì)開發(fā)者的約束就十分穩(wěn)固了。

所以,證書(及其對(duì)應(yīng)的私鑰)和配置文件是簽名和打包的兩個(gè)必要文件。必須深刻理解,才能在日常的錯(cuò)誤中找到解決辦法。

更多內(nèi)容可參考這幾篇:

Inside Code Signing

代碼簽名探析

iOS Code Signing 學(xué)習(xí)筆記


本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請(qǐng)及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://jstctz.cn/20434.html
相關(guān)開發(fā)語言
 八年  行業(yè)經(jīng)驗(yàn)

多一份參考,總有益處

聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費(fèi)獲得網(wǎng)站建設(shè)方案及報(bào)價(jià)

咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

業(yè)務(wù)熱線:余經(jīng)理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

  • QQ咨詢
  • 在線咨詢
  • 官方微信
  • 聯(lián)系電話
    座機(jī)0755-29185426
    手機(jī)13699882642
  • 預(yù)約上門
  • 返回頂部