郭建偉,燕 娜,陳佳宇
(北京市科學(xué)技術(shù)情報(bào)研究所 北京100044)
目前,國內(nèi)外主流的網(wǎng)絡(luò)身份認(rèn)證系統(tǒng)是基于證書(PKI/CA)技術(shù)的認(rèn)證模式。但是,PKI/CA認(rèn)證模式存在不足,它是采用RSA(或ECC)算法和證書認(rèn)證系統(tǒng),PKI/CA是通過建立CA認(rèn)證中心,為地區(qū)的多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)提供第三方認(rèn)證。由于PKI/CA的并發(fā)認(rèn)證速度較慢,單一認(rèn)證中心管理用戶量不足,認(rèn)證中心建設(shè)成本偏高,日常維護(hù)工作量較大;另外,PKI/CA的證書和公鑰,是以明文方式存放在CA認(rèn)證中心的數(shù)據(jù)庫中,容易受到黑客的攻擊,存在安全隱患,使得PKI技術(shù)在網(wǎng)絡(luò)認(rèn)證領(lǐng)域很難得到廣泛應(yīng)用。要實(shí)現(xiàn)網(wǎng)絡(luò)實(shí)名制,必須同時(shí)解決認(rèn)證安全性高、速度快、規(guī)模化、建設(shè)成本低、易于維護(hù)等難題。為此,我們提出一種使用加密卡(或加密機(jī))硬件設(shè)備,將全部證書加密成密文,存儲(chǔ)在CA認(rèn)證中心的證書數(shù)據(jù)庫中,保證證書的存儲(chǔ)安全和運(yùn)行安全,實(shí)現(xiàn)“芯片級”的PKI安全協(xié)議,提高PKI的安全等級。
(數(shù)字)證書是用于標(biāo)識實(shí)體身份的電子信息[1],它由CA(證書)簽發(fā)機(jī)構(gòu)簽發(fā),一個(gè)證書中包含的信息如圖1所示。
圖1 實(shí)體身份的電子信息Fig.1 Electronic information of entity identity
圖1中的信息就是一張證書的內(nèi)容,其中簽發(fā)者名、主體名采用的是X.500定義的甄別名格式,甄別名中通常包含有證書實(shí)體的名字,稱為通用名。還包含:證書的公鑰、簽名的密碼算法,以及實(shí)體所在的機(jī)構(gòu)(O)、部門(OU),所在的國家、省或州(S),郵件(E)等信息,證書序列號(證書的標(biāo)識)在對應(yīng)的證書簽發(fā)CA下是唯一的。
最終實(shí)體證書[2](對應(yīng)用戶的個(gè)人證書)由CA(證書)簽發(fā)機(jī)構(gòu)的私鑰簽名,而該CA簽發(fā)機(jī)構(gòu)私鑰對應(yīng)的公鑰用于對最終實(shí)體證書的簽名進(jìn)行驗(yàn)證,以確定該證書的簽名是否有效、證書是否由該CA簽發(fā)機(jī)構(gòu)簽發(fā)。實(shí)際上,CA簽發(fā)機(jī)構(gòu)的公鑰也是通過一個(gè)證書發(fā)布的,這個(gè)包含有CA簽發(fā)機(jī)構(gòu)公鑰的證書,稱為CA證書,并定義為中級CA證書(CA簽發(fā)機(jī)構(gòu)的證書)。該中級CA證書的主體名(即證書持有者名字),就是用該中級CA證書的私鑰簽發(fā)的最終實(shí)體證書中的簽發(fā)者名(即證書的簽發(fā)機(jī)構(gòu)名字)。
與最終實(shí)體證書類似,該中級CA證書也是由CA簽發(fā)機(jī)構(gòu)的另一個(gè)私鑰簽名的,即:該私鑰是CA簽發(fā)機(jī)構(gòu)的另一個(gè)公開密鑰對的私鑰,這個(gè)中級CA證書的主體名與簽發(fā)者名必須不同(即使它們是指向同一個(gè)認(rèn)證機(jī)構(gòu));該私鑰對應(yīng)的公鑰,也對應(yīng)有一個(gè)中級CA證書,稱為前一個(gè)中級CA證書的上一級中級CA證書。該上一級的中級CA證書有可能再由CA簽發(fā)機(jī)構(gòu)的另一個(gè)公開密鑰對的私鑰簽名,即它可能也有它的上一級的中級CA證書……當(dāng)最上一級的中級CA證書的主體名與簽發(fā)者名相同時(shí),該中級CA證書是一個(gè)自簽名的證書,被稱為根CA證書(圖2)。
圖2 根證書的簽發(fā)流程圖Fig.2 Root certificate issuing flow chart
從最終實(shí)體證書的簽發(fā)者出發(fā)[3],可以找到對其簽名的CA簽發(fā)機(jī)構(gòu)私鑰對應(yīng)的中級CA證書(最下一級的中級CA證書),即:最終實(shí)體CA證書的簽發(fā)者名,是最下一級中級CA的主體名,用該中級CA的私鑰對最終實(shí)體CA證書進(jìn)行簽名,用該中級CA的公鑰驗(yàn)證最終實(shí)體CA證書的簽名是否有效。從該最下一級中級CA證書的簽發(fā)者,我們可以找到其上一級的中級CA證書,即:該CA證書的簽發(fā)者名,是上一級中級CA的主體名,用上一級中級CA的私鑰對該中級CA證書進(jìn)行簽名,用上一級中級CA的公鑰驗(yàn)證該中級CA證書的簽名是否有效。重復(fù)這個(gè)過程,直到遇到一個(gè)自簽發(fā)的驗(yàn)證CA證書,即:根CA的簽發(fā)者是根CA的主體名,用根CA的私鑰對根CA證書進(jìn)行簽名,用根CA的公鑰驗(yàn)證根CA證書的簽名是否有效,同時(shí),用根CA的私鑰對下一級中級CA證書進(jìn)行簽名,用根CA的公鑰驗(yàn)證下一級中級CA證書的簽名是否有效。這一系列的最終實(shí)體證書、各個(gè)中級CA證書和根CA證書形成了一個(gè)證書鏈,也稱為證書信任鏈,或證書信任路徑(圖3)。證書鏈的長度在理論上是沒有限定的,它可以只包含有根CA證書,也可以包含有多個(gè)中級CA證書(根CA以下的CA證書都稱為中級CA證書),甚至可以是僅包含一個(gè)自簽名的最終實(shí)體證書(這種自簽名最終實(shí)體證書通常用于特殊的場合)。
因此,在判斷一個(gè)最終實(shí)體證書是否有效時(shí),根CA證書起著極其重要的作用,它是證書信任的“根”[4]。驗(yàn)證一個(gè)實(shí)體證書的可信性,需要找到相關(guān)的各級中級CA證書和根CA證書,構(gòu)造證書鏈,并需要確定證書鏈的根CA證書是否可信。
但是,全部最終實(shí)體CA證書都是以明文形式存放在CA認(rèn)證中心的證書數(shù)據(jù)庫中,對全部最終實(shí)體CA證書進(jìn)行簽名的中級證書,以及該中級CA證書的上一級的其他中級CA和根CA證書,也都是以明文形式存放在證書數(shù)據(jù)庫里,這就給PKI的CA認(rèn)證中心留下了安全隱患。
證書的主要漏洞是:全部用戶的最終實(shí)體CA證書、各個(gè)中級CA證書和根CA證書,都是以明文形式[5]分別存放在CA認(rèn)證中心的證書數(shù)據(jù)庫里,PKI的各種安全協(xié)議是在CA認(rèn)證中心的服務(wù)器里運(yùn)行,僅僅依靠CA認(rèn)證中心的防火墻和防病毒系統(tǒng)無法保證它們的存儲(chǔ)安全,國際標(biāo)準(zhǔn)化(公開)的PKI各種安全協(xié)議也為黑客攻擊PKI系統(tǒng)提供了途經(jīng)。
圖3 實(shí)體證書的簽發(fā)者流程圖Fig.3 Flow chart for issuers of physical certificates
攻擊者能夠使用計(jì)算機(jī)病毒程序獲取CA認(rèn)證中心證書數(shù)據(jù)庫中全體用戶的證書。根據(jù)證書公開的內(nèi)容獲得如下重要信息:①該P(yáng)KI系統(tǒng)采用的公鑰密碼算法類型和密鑰長度,如RSA算法的密鑰長度為512bit、1024bit、2048bit、4096bit,ECC算法的密鑰長度為160bit、190bit等;②該P(yáng)KI系統(tǒng)采用的摘要算法類型,如SHA-1摘要算法對文件摘要的長度為256bit,MD5摘要算法對文件摘要的長度為128bit。
攻擊者通過對證書進(jìn)行分析[6],偽造密鑰對(公鑰和私鑰),通過分析確定了證書中哪些是最終實(shí)體證書,哪些是證書信任鏈中的中級CA證書和根CA證書,再偽造證書信任鏈上的所有證書的密鑰對,來躲避PKI的安全自檢系統(tǒng)對證書信任鏈的安全檢測(即簽名驗(yàn)證)。
首先,在客戶端,攻擊者可以從芯片生產(chǎn)商那里買含有PKI標(biāo)準(zhǔn)安全協(xié)議的加密芯片(USB-KEY),將偽造客戶端對應(yīng)的私鑰和證書(這兩組數(shù)據(jù))寫入U(xiǎn)SB-KEY里,存放在USB-KEY芯片里的PKI安全協(xié)議不用替換,從而在客戶端USB-KEY里建立起基于偽造私鑰和證書的各種PKI安全協(xié)議[7]。
之后,對CA認(rèn)證中心端全體證書內(nèi)容進(jìn)行修改,主要篡改各個(gè)證書中的公鑰和數(shù)字簽名內(nèi)容,證書中的其他內(nèi)容都不變。先偽造每個(gè)證書的“密鑰對”,并用偽造的根CA證書對應(yīng)的公鑰,來替換原根CA證書中的公鑰,用偽造的根CA證書對應(yīng)的私鑰,對根CA證書進(jìn)行簽名并將偽造的簽名代替根CA證書的原簽名。同時(shí),用偽造的根CA證書對應(yīng)的私鑰,對最上一級的中級CA證書進(jìn)行簽名,將該偽造的簽名結(jié)果來代替原最上一級的中級CA證書中的簽名;用偽造的最上一級的中級CA證書對應(yīng)的公鑰,來替換原最上一級的中級CA證書中的公鑰,用偽造的最上一級的中級CA證書對應(yīng)的私鑰,對下一級中級證書進(jìn)行簽名,如此類推,用偽造的最下一級的中級CA證書對應(yīng)的公鑰,來替換原最下一級中級CA證書中的公鑰,用偽造的最下一級的中級CA證書對應(yīng)的私鑰,分別來對全部用戶的最終實(shí)體證書進(jìn)行簽名,得到全部用戶的最終實(shí)體證書中的偽造簽名,并用這些偽造簽名代替原最終實(shí)體證書中的簽名。這樣,攻擊者篡改了CA認(rèn)證中心全體證書。
攻擊者再利用病毒程序,將修改后的全體證書替換原CA認(rèn)證中心證書數(shù)據(jù)庫中的證書內(nèi)容。CA認(rèn)證中心端的公鑰密碼算法、摘要算法和各種安全協(xié)議都保持不變。另外,當(dāng)證書吊銷列表里只存儲(chǔ)了證書的標(biāo)識和證書的狀態(tài)時(shí),攻擊者也不需要篡改證書吊銷列表中的內(nèi)容。若證書吊銷列表里存儲(chǔ)證書全部內(nèi)容,則需要將偽造的證書替換證書吊銷列表里的存儲(chǔ)證書。至此,攻擊者基本完成對CA認(rèn)證中心端的攻擊準(zhǔn)備。
當(dāng)CA認(rèn)證中心為第三方提供密碼認(rèn)證時(shí),攻擊者不需要偽造WEB服務(wù)器證書就能對第三方WEB服務(wù)器進(jìn)行攻擊。由于CA認(rèn)證中心將認(rèn)證結(jié)果轉(zhuǎn)發(fā)給應(yīng)用系統(tǒng)WEB服務(wù)器,攻擊者通過PKI安全協(xié)議的認(rèn)證后已經(jīng)成為合法用戶,則CA認(rèn)證中心里的安全協(xié)議直接調(diào)用該WEB服務(wù)器證書的公鑰加密偽造的認(rèn)證結(jié)果,并發(fā)送給應(yīng)用系統(tǒng)的WEB服務(wù)器。在WEB服務(wù)器里,服務(wù)器證書對應(yīng)的私鑰再對認(rèn)證結(jié)果密文進(jìn)行解密,得到CA認(rèn)證中心認(rèn)證結(jié)果的明文。這時(shí),認(rèn)證結(jié)果已經(jīng)被黑客篡改了。
在CA認(rèn)證中心全部用戶的最終實(shí)體證書都是以密文形式存儲(chǔ)在證書數(shù)據(jù)庫中,證書信任鏈上各中級證書和根證書存放在芯片硬件里,能保證認(rèn)證中心全部最終實(shí)體證書、信任鏈上各個(gè)中級證書和根證書的存儲(chǔ)安全,同時(shí),保證CA認(rèn)證中心端的各種證書是可信的。即使攻擊者想篡改用戶的最終實(shí)體證書,但在無法獲得加密證書的密鑰的情況下,也無法將篡改后的最終實(shí)體證書加密成攻擊者可用的密文,從而防止攻擊者通過篡改最終實(shí)體證書,來攻擊CA認(rèn)證中心的各種安全協(xié)議。
PKI/CA的解決方案也存在一些問題,用戶可用性、應(yīng)用的標(biāo)準(zhǔn)化和安全性是突出問題之一。一般而言CA負(fù)責(zé)證書的簽發(fā)和有效性認(rèn)證并不對應(yīng)用負(fù)責(zé),數(shù)字證書的應(yīng)用在工程層面面臨的兼容性、可用性、規(guī)范性、安全性問題依然很多,各家CA中心和產(chǎn)業(yè)參與者積極推動(dòng)解決方案和應(yīng)用創(chuàng)新,制定和推動(dòng)數(shù)字證書應(yīng)用標(biāo)準(zhǔn)化、規(guī)范化的相關(guān)行業(yè)、國家標(biāo)準(zhǔn),但應(yīng)用問題整體上的改觀依然遙遙無期。例如,PC瀏覽器的兼容性就是證書應(yīng)用揮之不去的噩夢,這也是CA業(yè)務(wù)推廣受限的核心問題之一。同時(shí),不同CA中心證書的互通性受制于信任體系和服務(wù)協(xié)議的制約,不是一個(gè)單純靠技術(shù)可以解決的問題。另外,應(yīng)用依賴單一服務(wù)機(jī)構(gòu)的單點(diǎn)問題,是證書應(yīng)用的另一個(gè)擔(dān)心,很多以聯(lián)盟或應(yīng)用能力平臺(tái)的解決方案試圖解決單個(gè)CA中心依賴的問題,其實(shí)質(zhì)是用一個(gè)更大的中心單點(diǎn)取代另一個(gè)中心單點(diǎn)而已。核心訴求解決匿名、去單點(diǎn)依賴的中心化問題,匿名通過賬戶地址去實(shí)現(xiàn),賬戶地址是非對稱密鑰對的公鑰變形,以每次交易生成一個(gè)賬戶的原則,可以避免識別出賬戶的持有者身份,也就是你可以知道一個(gè)賬號,但不知道賬號的持有者。其實(shí)由于數(shù)字貨幣的可分割特性,在一筆交易中如果出現(xiàn)多個(gè)關(guān)聯(lián)賬號,只要一個(gè)賬號的泄露或可推測,就存在賬號持有身份被推測出來的可能性。由于非法交易和洗錢的嫌疑始終和匿名密不可分,匿名屬性是各國政府是否接納比特幣等數(shù)字貨幣的一個(gè)判斷依據(jù)。同時(shí),隨著區(qū)塊鏈的賬本長度增加和比特幣賬戶私鑰保管問題的突出,云錢包是一種主流發(fā)展趨勢,云錢包需要賬戶的認(rèn)證,對匿名性原則有較大的影響。從監(jiān)管、技術(shù)的角度上來看,數(shù)字貨幣或區(qū)塊鏈記賬賬戶匿名性原則的堅(jiān)持存在爭議。
本方案通過對標(biāo)準(zhǔn)PKI的分析,指出了PKI的CA認(rèn)證中心普遍存在的用戶證書安全漏洞,分析了攻擊者能夠利用PKI存在的安全漏洞,攻擊CA認(rèn)證中心的方法和過程,提出了在證書初始化階段對CA認(rèn)證中心的全體最終實(shí)體CA證書進(jìn)行加密,并將信任鏈上的各個(gè)中級證書和根證書存放在芯片里,以保證CA認(rèn)證中心全體最終實(shí)體CA證書,以及信任鏈上的各中級CA證書和根CA證書數(shù)據(jù)的安全存儲(chǔ),防止攻擊者利用計(jì)算機(jī)病毒替換用戶的最終實(shí)體CA證書。