開發(fā)者證書

最近學(xué)習(xí)了一下iOS代碼簽名機(jī)制 ,這里做個(gè)筆記記錄,整理思路,加深理解。
想了解更多iOS簽名相關(guān),強(qiáng)烈推薦去看看原文,寫的太棒了。原文出處 深度長文:細(xì)說iOS代碼簽名 。

前言

眾所周知,iOS設(shè)備并不能像 Android 那樣任意地安裝 app ,app 必須被 Apple 簽名之后才能安裝到設(shè)備上。然而,開發(fā)者在開發(fā)App的時(shí)候,需要頻繁地修改代碼并安裝到設(shè)備上進(jìn)行測試,不可能每次都先上傳給Apple進(jìn)行簽名,因此需要一種不需要蘋果簽名就可以運(yùn)行的機(jī)制。這里就引入了開發(fā)者證書及相應(yīng)的機(jī)制。

這個(gè)機(jī)制的實(shí)現(xiàn)方式是:

  • 開發(fā)者自己持有一套密鑰和證書,可以自行對app進(jìn)行簽名
  • 由Apple對開發(fā)者的身份進(jìn)行“背書”,讓設(shè)備間能夠接信任開發(fā)者自行簽名的app,這個(gè)“背書”的方式就是后面會(huì)提到的Provisioning Profile

生成CSR文件(Certificate Signing Request)

在Keychain菜單欄選擇”從證書頒發(fā)機(jī)構(gòu)請求證書…”

request.png
request_2.png

這個(gè)操作會(huì)產(chǎn)生一個(gè)名為CertificateSigningRequest.certSigningRequest 的簽名請求文件,在生成這個(gè)文件之前其實(shí)Keychain已經(jīng)自動(dòng)生成了一對公、私鑰。

password.png

CSR文件的內(nèi)容其實(shí)就是個(gè)人信息、公鑰,以及自簽名(使用自己的私鑰進(jìn)行簽名), 可通過openssl命令查看其內(nèi)容:

$ openssl req -in ~/Desktop/CertificateSigningRequest.certSigningRequest -text -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: emailAddress=test@qq.com, CN=JustTest, C=CN
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bd:8c:c0:27:9b:17:73:ef:bd:6d:ea:b4:ad:aa:
                    xx:xx:xx:xx:xx:xx:xx:...
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         33:82:f9:8a:fe:8a:bd:08:52:04:9f:a2:d0:0e:dd:92:ee:62:
         xx:xx:xx:xx:xx:xx:xx:...

提交給Apple進(jìn)行簽名

在蘋果開發(fā)者網(wǎng)站,將CSR提交給Apple進(jìn)行簽名,Apple會(huì)返回一個(gè)簽好名的證書文件,后綴名為cer。這個(gè)流程對應(yīng)上一章中證書請求流程。

雙擊即可將其導(dǎo)入到 Keychain 中,Keychain 會(huì)自動(dòng)把它之前創(chuàng)建CSR時(shí)自動(dòng)生成的密鑰歸為一組。無論是在證書列表中查看還是在密鑰列表中查看,都能看到與之匹配的另一半。

可以從證書中得到幾個(gè)關(guān)鍵信息:

  1. 證書的所有者,這部分信息并非由我們自行指定,而是簽發(fā)者Apple根據(jù)我們的Apple ID賬號(hào)信息自動(dòng)生成
  2. 證書的簽發(fā)者,即前文所述的CA
  3. 證書的公鑰信息,與之前生成的密鑰文件及CSR完全一致

現(xiàn)在應(yīng)該可以理解證書和密鑰的關(guān)系了,密鑰中保存了私鑰和公鑰,私鑰用于簽名,而證書里面有且只有公鑰,并且是被第三方 CA “認(rèn)證” 過,用于解密和校驗(yàn)。

這里有一點(diǎn)需要注意:蘋果返給我們的證書文件 xxx.cer ,里面只有公鑰相關(guān)的信息,是用來解密和校驗(yàn)的。所以單純把 xxx.cer 文件發(fā)送給其他開發(fā)同學(xué),沒有對應(yīng)的私鑰,是無法進(jìn)行簽名的,使用真機(jī)調(diào)試時(shí)會(huì)報(bào)證書錯(cuò)誤等提示。這里需要將私鑰和證書一起導(dǎo)出為 p12 文件。

一般我們說使用證書簽名,實(shí)際上是使用與證書所匹配的私鑰進(jìn)行簽名,證書只是作為簽名數(shù)據(jù)的一部分被嵌入到簽名結(jié)構(gòu)中。

打開證書可以看到這個(gè)證書的簽發(fā)者是Apple Worldwide Developer Relations Certification Authority,在Keychain中搜索這個(gè)名字, 可以看到它的證書詳情,如下圖:

cer.png

我們會(huì)發(fā)現(xiàn),它的類型是中級證書頒發(fā)機(jī)構(gòu)(中級CA),它也包含簽名,并且是由另外一個(gè)叫做Apple Root CA根證書頒發(fā)機(jī)構(gòu)(根CA)進(jìn)行簽發(fā)的,這樣就形成了一條證書鏈。而繼續(xù)查看Apple Root CA的證書,會(huì)發(fā)現(xiàn)它是自簽名的,因?yàn)樗鼤?huì)被內(nèi)置在設(shè)備中,設(shè)備無條件信任它,也就不需要其他的機(jī)構(gòu)為其背書了。

這樣的證書鏈機(jī)制可以簡化根證書頒發(fā)機(jī)構(gòu)的工作,同時(shí)提升證書管理的安全性。將頒發(fā)底層證書的工作分散給多個(gè)中級證書頒發(fā)機(jī)構(gòu)進(jìn)行處理,根證書頒發(fā)機(jī)構(gòu)只需要對下一級機(jī)構(gòu)的證書進(jìn)行管理和簽發(fā),降低根證書頒發(fā)機(jī)構(gòu)私鑰的使用頻率,也就降低了私鑰泄露的風(fēng)險(xiǎn)。中級證書頒發(fā)機(jī)構(gòu)各司其職,即使出現(xiàn)私鑰泄露這樣的重大安全事故,也不至于波及整個(gè)證書網(wǎng)絡(luò)。

總結(jié)

到這里,我們已經(jīng)實(shí)現(xiàn)了上述機(jī)制中的第一點(diǎn):

  • 開發(fā)者自己持有一套密鑰和證書,可以自行對app進(jìn)行簽名

因?yàn)槲覀兊淖C書是經(jīng)過蘋果CA認(rèn)證過的,手機(jī)上需要解密校驗(yàn)簽名的時(shí)候,可以通過證書中的CA信息認(rèn)證公鑰是否正確。進(jìn)一步通過認(rèn)證后的公鑰解密校驗(yàn)簽名,從而確定代碼及相應(yīng)資源的完整性等。用通俗的話說,證書確保了,開發(fā)者開發(fā)的東西確實(shí)都是開發(fā)者的東西,沒有被第三者篡改。

如果我們的app是提交到 App Store ,會(huì)有蘋果審核,確保你的 app 是安全的,沒有包含對應(yīng)的惡意代碼等等。同時(shí) App Store 也會(huì)使用蘋果的私鑰對我們的 app 進(jìn)行重簽名。當(dāng)設(shè)備需要安裝 app 時(shí),校驗(yàn)簽名,一看證書是蘋果自己的證書,且校驗(yàn)沒問題,直接正常安裝使用。

但是,當(dāng)我們在開發(fā)過程中,使用的是我們自己證書進(jìn)行的簽名。設(shè)備在安裝 app 時(shí),校驗(yàn)簽名,一看證書是一個(gè)開發(fā)者證書。設(shè)備此時(shí)不知道,你這個(gè)開發(fā)者本身的身份如何,你開發(fā)的 app 也沒有經(jīng)過審核,會(huì)不會(huì)有安全問題、會(huì)不會(huì)竊取設(shè)備上敏感信息等。所以設(shè)備不能信任你的 app,也就不能正常安裝使用。

未來解決上述問題,就用到了 Provisioning Profile 文件,也即上述機(jī)制中的第二點(diǎn):

  • 由Apple對開發(fā)者的身份進(jìn)行“背書”,讓設(shè)備間能夠接信任開發(fā)者自行簽名的app,這個(gè)“背書”的方式就是后面會(huì)提到的Provisioning Profile

總結(jié)一下:

  1. 證書保證開發(fā)者開發(fā)的 app 沒有被篡改。即證書保證 app。
  2. Provisioning Profile 保證開發(fā)者本身的身份,讓設(shè)備信任開發(fā)者簽名的 app 。即 Provisioning Profile 保證開發(fā)者。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容