證書
??——為公鑰上數(shù)字簽名
什么是證書
?要開車得先考駕照蛹锰,駕照上面有本人的照片宫盔、姓名、出生日期等個人信息眉睹,以及有效期荔茬,及準駕車輛等信息。
?公鑰證書(Public-Key Certificate辣往,PKC)其實和駕照很相似兔院,里面記有姓名、組織站削、郵箱地址等個人信息坊萝,以及屬于此人的公鑰,并由認證機構(Certification Authority许起、Certifying Authority十偶,CA)施加數(shù)字簽名。只要看到公鑰證書园细,我們就可以知道認證機構認定該公鑰的確屬于此人惦积。公鑰證書也稱為證書(certificate)。
證書應用場景
?認證機構必須是可信的猛频,對于“可信的第三方”狮崩,會使用Trent這個名詞。
- Bob生成密鑰對
- Bob在認證機構Trent注冊資金的公鑰
- 認證機構Trent用自己的私鑰對Bob的公鑰施加數(shù)字簽名并生成證書
- Alice得到帶有認證機構Trent的數(shù)字簽名的Bob的公鑰(證書)
- Alice使用認證機構Trent的公鑰驗證數(shù)字簽名鹿寻,確認Bob的公鑰的合法性
- Alice用Bob的公鑰加密消息并發(fā)送給Bob
- Bob用自己的私鑰解密密文得到哦Alice的消息
公鑰基礎設施(PKI)
?公鑰基礎設施(Public-Key Infrastucture)是為了能夠更有效地運用公鑰而制定的一系列的規(guī)范和規(guī)格的總稱睦柴。公鑰基礎設施一般簡稱PKI。
?PKI只是一個總稱毡熏,而并非指某一個單獨的規(guī)范或規(guī)格坦敌。例如,RSA公司所制定的PKCS(Public-Key Ctyptography Standards痢法,公鑰密碼標準)系列規(guī)范也是PKI的一種狱窘,而互聯(lián)網(wǎng)規(guī)格RFC(Request for Comments)中也有很多與PKI相關的文檔。在開發(fā)PKI程序時所使用的由各個公司公司編寫的API和規(guī)格設計書也可以算是PKI的相關規(guī)格财搁。
?因此蘸炸,根據(jù)具體所采用的的規(guī)格,PKI也會有很多變種妇拯,這也是很多人難以整體理解PKI的原因之一幻馁。
PKI的組成要素
?PKI的組成要素主要有以下3個:
- 用戶-使用PKI的人
- 認證機構-頒布證書的人
- 倉庫-保存證書的數(shù)據(jù)庫
?由于PKI中用戶和認證機構不僅限于“人”(也可能是計算機)洗鸵,因此我們可以給他們命名為實體越锈。實體就是進行證書和密鑰相關處理的行為主體仗嗦。
PKI的組成要素.png
用戶
? 用戶就是像Alice、Bob這樣使用PKI的人甘凭,用戶包括兩種:一種是系統(tǒng)是用PKI注冊自己的公鑰的人稀拐,另一種是系統(tǒng)使用已注冊的公鑰的人。一般兩種用戶所需要進行的操作丹弱。
[注冊公鑰的用戶所進行的操作]
- 生成密鑰對(也可以由認證機構生成)
- 在認證機構注冊公鑰
- 向認證機構注冊公鑰
- 向認證機構申請證書
- 根據(jù)需要申請作廢已注冊的公鑰
- 解密接收到的密文
- 對消息進行數(shù)字簽名
[使用已注冊公鑰的用戶所進行的操作]
- 將消息加密后發(fā)送給接收者
- 驗證數(shù)字簽名
認證機構(CA)
?認證機構(Certification Authority德撬,CA)是對證書進行管理的人(Trent)。認證機構具體所進行的操作如下:
- 生成密鑰對(也可由用戶生成)
- 在注冊公鑰時對本人身份進行認證
- 生成并頒發(fā)證書
- 作廢證書
?認證機構的工作中躲胳,公鑰注冊和本人身份證這一部分可以由注冊機構來分擔蜓洪,這樣一來,認證機構就可以將經(jīng)理集中到頒發(fā)證書上坯苹,從而減輕了認證機構的負擔隆檀,不過,引入注冊機構也有弊端粹湃,比如說認證機構需要對注冊機構本身進行認證恐仑,而且隨著組成要素的增加,溝通過程也會變得復雜为鳄,容易遭受攻擊的點也會增加裳仆。
倉庫
?倉庫是一個保存證書的數(shù)據(jù)庫,PKI用戶在需要的時候可以從中獲取證書孤钦,它的作用優(yōu)點像打電話時使用的電話本歧斟。Alice獲取Bob的證書時,就可以使用倉庫偏形。倉庫也叫作證書目錄静袖。
認證機構的工作
生成密鑰對
? 生成密鑰對有兩種方式:一種是由PKI用戶自行生成,一種是由認證機構來生成壳猜。在認證機構生成密鑰對的情況下勾徽,認證機構需要將私鑰發(fā)送給用戶。
注冊證書
?在用戶自行生成密鑰對的情況下统扳,用戶會請求認證機構生成證書喘帚。申請證書時所使用的規(guī)范是由RFC2986等定義的。
?認證機構根據(jù)其認證業(yè)務準則(Certification Practice Statement咒钟,CPS)對用戶的身份進行認證吹由,并生成證書。在生成證書時朱嘴,需要使用認證機構的私鑰來進行數(shù)字簽名倾鲫。生成證書格式是由X.509定義的粗合。
作廢證書與CRL
?當用戶的私鑰丟失,被盜時乌昔,認證機構需要對證書進行作廢 隙疚。此外,即便私鑰安然無恙磕道,有時候也需要作廢證書供屉,例如用戶從公司離職導致其時區(qū)私鑰的使用權限,或是名稱變更導致和證書中記載的內(nèi)容不一致等情況溺蕉。
?紙質(zhì)證書只要撕毀就可以作廢了伶丐,但這里的證書時數(shù)字信息,即便從倉庫中刪除也無法作廢疯特,因為用戶會保存證書的副本哗魂,但人在機構又不能入侵用戶的電腦將副本刪除。
?要作廢證書漓雅,人在機構需要制作一張證書作廢清單录别,簡稱CRL。
?CRL是認證機構宣布作廢證書的一覽表故硅,具體來說庶灿,是一張已作廢證書序列號的清單,并由認證機構加上數(shù)字簽名吃衅。證書序列號是認證機構在頒發(fā)證書時所賦予的編號往踢,在證書中都會記載。
?PKI用戶需要從認證機構獲取最新CRL徘层,并查詢自己要用于驗證簽名的公鑰證書是否已經(jīng)作廢峻呕。
?假設我們手上有Bob的證書,該證書有合法的認證機構簽名趣效,而且也在有效期內(nèi)瘦癌,但僅憑這些還不能說明該證書一定是有效地,還需要查詢認證機構最新的CRL跷敬,并確認該證書是否有效讯私。一般來說,這個檢查不是用戶自身來完成的西傀,而是應該由處理該證書的軟件來完成斤寇,但由很多軟件并沒有及時更新CRL。
證書的層級結(jié)構
?對于用來驗證數(shù)字簽名的認證機構的公鑰拥褂,怎樣才能判斷它是否合法呢娘锁?對于認證機構的公鑰,可以由其他認證機構施加數(shù)字簽名饺鹃,從而對認證機構的公鑰進行驗證莫秆,即生成一張認證機構的公鑰證書间雀。
?一個認證機構來驗證另一個認證機構,這樣的關系可以迭代好幾層镊屎。這樣一種認證機構之間的層級關系惹挟,我們可以用公司內(nèi)容部PKI來類比:
?假設Bob是札幌辦事處的一名員工,札幌辦事處員工的公鑰都是由札幌辦事處認證機構頒發(fā)的杯道。
?對于札幌辦事處認證機構的公鑰匪煌,則由北海道分公司認證機構頒發(fā)證書责蝠,而對于北海道分公司認證機構的公鑰党巾,則由東京公司的認證機構頒發(fā)的,以此類推霜医。不過這個鏈條不能無限延伸齿拂,總要有一個終點,如果這個終點就是東京總公司認證機構的話肴敛,該機構一般稱為根CA(Root CA)署海。而對于東京總公司認證機構,則由東京總公司認證機構自己來頒發(fā)證書医男,這種對自己的公鑰進行數(shù)字簽名的行為稱為自簽名(self-signature)砸狞。
?現(xiàn)在我們假設Alice要驗證札幌辦事處員工Bob的數(shù)字簽名,那么Alice需要執(zhí)行如下步驟:
圖所示镀梭,就是Alice對Bob的簽名進行驗證的整個過程刀森。當然,如此復雜的驗證鏈條不會是由人來操作的报账,而是由電子郵件或瀏覽器等軟件自動完成的研底。
各種各樣的PKI
?認證機構只要對公鑰進行數(shù)字簽名就可以了,因此任何人都可以成為認證機構透罢,實際上世界上已經(jīng)有無數(shù)個認證機構了榜晦。
?國家、地方政府羽圃、醫(yī)院乾胶、圖書館等公共組織和團體可以成立認證機構來實現(xiàn)PKI,公司也可以出于業(yè)務需要在內(nèi)部實現(xiàn)PKI朽寞,甚至你和你的朋友也可以以實驗的為目的來構建PKI识窿。
對證書的攻擊
在公鑰注冊之前進行攻擊
?證書是認證機構對公鑰及其持有者的信息加上數(shù)字簽名的產(chǎn)物,由于加上數(shù)字簽名之后會非常難以攻擊愁憔,因此我們可以考慮對施加數(shù)字簽名之前的公鑰進行攻擊腕扶。
?假設Bob生成了密鑰對,并準備在認證機構注冊自己的公鑰吨掌。在認證機構進行數(shù)字簽名之前半抱,主動攻擊者Mallory將公鑰換成了自己的脓恕。這樣一來,認證機構就會對“Bob的個人信息”和“Mallory的公鑰”這個組合進行數(shù)字簽名窿侈。
? 要防止這種攻擊炼幔,我們可以采用下面的做法,例如Bob可以在將公鑰發(fā)送給認證機構進行注冊時史简,使用認證機構的公鑰對Bob的公鑰進行加密乃秀。此外,認證機構在確認Bob的身份時圆兵,也可以將公鑰的指紋一并發(fā)送給Bob請他進行確認跺讯。
注冊相似人名進行攻擊
?證書認證機構對公鑰及其持有者的信息加上數(shù)字簽名的產(chǎn)物,對于一些相似的身份證信息殉农,計算機可以進行區(qū)別刀脏,但是人類往往很容易認錯,而就可以被用來進行攻擊超凳。
例如愈污,假設Bob的用戶信息中名字的部分:
Name = Bob (首字母大寫)
而Mallory用另外一個類似的用戶信息:
Name = BOB (全部大寫)
注冊了另一個不同的公鑰。這個工喲的名字叫做BOB轮傍,但實際上卻是Mallory的公鑰暂雹。
隨后,Mallory 偽裝成Bob创夜,將
Name = BOB
的公鑰發(fā)送給Alice杭跪。Alice看到證書中的用戶信息,很可能就會將BOB誤認為是自己要發(fā)送消息的對象Bob挥下。
?要防止這種攻擊揍魂,認證機構必須確認證書中所包含的信息是否真的是其持有人的個人信息,當本人身份全肉失敗時則不向其頒發(fā)證書棚瘟。認證機構的認證業(yè)務規(guī)則中就規(guī)定了這樣的方針现斋。
竊取認證機構的私鑰進行攻擊
?主動攻擊者Mallory想出了一個大膽的攻擊方式,那就是竊取認證機構的私鑰偎蘸。如果得到認證機構的私鑰庄蹋,那么任何人都可以以該認證機構的身份頒發(fā)證書了。
?一般來說迷雪,當發(fā)現(xiàn)主動攻擊者Mallory利用認證機構的私鑰簽發(fā)證書時限书,就可以斷定認證機構的私鑰被竊取了,由于認證機構記錄了自己簽發(fā)的證書的序列號章咧,因此能判斷某個證書是不是該認證機構自己簽發(fā)的倦西。
?如果認證機構的私鑰被竊取,認證機構就需要養(yǎng)私鑰泄露一事通過CRL通知用戶赁严。
攻擊者偽裝成認證機構進行攻擊
?主動攻擊者Mallory又想出一個更大膽的方法扰柠,那就是Mallory自己偽裝成為認證機構的攻擊粉铐。
?所以說,如果認證機構本身不可信卤档,即便證書核發(fā)蝙泼,其中的公鑰也不能使用。要防范這種攻擊卻需要Alice自己多加留心才行劝枣,她必須要注意自己所得到的證書是哪個認證機構頒發(fā)的汤踏,這個機構是否可信。
鉆CRL的孔子進行攻擊(1)
? 從公鑰失效到Alice收到證書作廢清單(CRL)需要經(jīng)過一段時間舔腾,主動攻擊者Mallory可以利用CRL發(fā)布的時間差來發(fā)動攻擊溪胶。
?要防御這樣利用CRL發(fā)布的時間差所發(fā)動的攻擊是非常困難的。因此琢唾,對于這種攻擊的對策是:
- 當公鑰失效時盡快通知認證機構
- 盡快發(fā)布CRL
- 及時根系CRL
此外我們還需要做到: - 在使用公鑰之前载荔,再次確認公鑰是否已經(jīng)失效
鉆CRL的孔子進行攻擊(2)
?雖然數(shù)字簽名能夠防止否認,但通過鉆CRL的空子采桃,就有可能失效否認,這種方法實際上是“鉆CRL的空子進行攻擊(1)”的另一種用法丘损。
?假設Bob是一個壞人普办,他設想一個從Alice手上騙錢的計劃。
?首先徘钥,Bob用假名字舍利一個賬戶X-5897衔蹲,然后他寫了一封郵件給Alice,請她像這個賬號轉(zhuǎn)賬呈础。郵件使用Bob(自己)的私鑰進行數(shù)字簽名舆驶。
?Bob將這封郵件發(fā)送給Alice之后,又向認證機構Trent發(fā)送了一封郵件告知自己的公鑰已經(jīng)失效而钞。
?在從Trent處收到的新的CRL之前沙廉,Alice已經(jīng)驗證了簽名并執(zhí)行了轉(zhuǎn)賬。
?Bob趕快從自己用假名字開設的賬戶X-5879中把錢取出來臼节。
收到Trent的CRL之后撬陵,Alice大為震驚,于是它嘗試聯(lián)系Bob网缝。
?Bob裝作不知道這件事巨税,給Alice回信。
?Bob實際上就是在否認這件事粉臊。
?要完全防止這種攻擊是很困難的草添。盡管我們可以將簽名的時間和發(fā)送公鑰作廢的請求的時間進行對比,但是私鑰泄露之后很久才發(fā)現(xiàn)也是很正常的扼仲,因此中對比也沒有什么意義远寸。
?在這個事件中促王,通過公鑰、證書等技術無法識別出Bob的犯罪行為而晒,必須要依靠刑事偵查才行蝇狼。
?為了快速確認證書是否已經(jīng)失效,人們設計了一種名為OCSP的協(xié)議倡怎,詳情請參見RFC2560迅耘。
關于證書的Q&A
疑問:
?我不理解證書的必要性。通過認證機構的證書來獲取公鑰监署,和直接獲取公鑰到底有什么不一樣呢?
回答:
?在通過不可信的途徑獲取公鑰時颤专,可能遭到前面提到的中間人攻擊。Alice本來想要獲取的是Bob的公鑰钠乏,但實際上得到的卻是主動攻擊者Mallory的公鑰栖秕。
?如果從認證機構獲取公鑰,就可以降低遭到中間人攻擊的風險晓避。因為帶有證書的公鑰是經(jīng)過認證機構進行數(shù)字簽名的簇捍,事實上無法被篡改。但現(xiàn)在問題是俏拱,我們又該如何獲取認證機構本身的公鑰呢暑塑?
?如果將上面的這個問題替換成“我自己現(xiàn)在所持有的公鑰中,哪一個最可信”這樣一個問題锅必,也許更容易理解事格。例如,如果Alice和Bob本人見面搞隐,Bob直接將自己的公鑰交給Alice的話驹愚,就不需要認證機構了,這是因為Alice可以確信自己所得到的就是Bob的公鑰劣纲。
?然后在Alice和Bob無法見面的情況下逢捺,或者是即便直接見面Alice也無法確信對方就是Bob本人的情況下,認證機構和證書的存在就有意義了味廊。因為Alice得到帶有認證機構數(shù)字簽名的Bob的公鑰蒸甜,就表示將Bob本人身份確認這項工作委托給了認證機構。認證機構則將認可該公鑰確實屬于Bob的這一事實通過證書傳送給Alice余佛。
總結(jié)一下:
?如果能歐取得可信的公鑰柠新,則不需要認證機構
?當持有可信的認證機構的公鑰,并相信認證機構所進行的身?份確認情況下辉巡,則可以信任該認證機構頒發(fā)的證書以及通過該途徑取得的公鑰恨憎。
疑問:
?無論是證書的格式還是PKI,使用公開的技術總覺得不放心,我覺得使用公開的技術就等于攻擊者提供了用于攻擊的信息憔恳,相比之下瓤荔,還是使用公司開發(fā)的保密認證方法更安全吧?
回答:
?不钥组,這樣是錯誤的输硝。
?自己開發(fā)的保密的認證方法是犯了典型的隱藏安全錯誤。本書中已措辭強調(diào)程梦,私下開發(fā)安全相關的技術是非常危險的点把。僅靠一家公司的力量無法開發(fā)出足以抵御攻擊的安全技術,這一點不僅限于密碼技術屿附,對于數(shù)字簽名和證書等認證技術也同樣適用郎逃。
?使用公開的技術的確會為攻擊者提供用于攻擊的信息,但與此同時挺份,全世界的安全專家也在為這些公開的技術尋找漏洞褒翰。
?請注意,使用公開的技術和把自己的公司采用的技術公開是兩碼事匀泊。
?采用已經(jīng)公開的优训,并積累大量成果的技術是正確的決定,然而并不需要將自己公司所采用的技術的細節(jié)公開出來探赫。我們拿員工訪問公司內(nèi)部往來的方法為例型宙。驗證員工的合法身份以采用公開的,積累了大量成果的技術伦吠,但是我們并不需要講這些細節(jié)公開出來,而是只要告知相關的員工就可以了魂拦。這樣我們就可以將風險控制到最小毛仪,萬一有人惡意將技術的詳細信息公開出來,也不會產(chǎn)生嚴重的問題芯勘,因為我們所使用的技術原本就是公開的箱靴。
?反過來說,如果我們使用的技術是依靠對細節(jié)的保密來保證安全的荷愕,那么一旦有人惡意泄露技術細節(jié)衡怀,就會造成嚴重的問題。
?靠隱蔽來保證安全是錯誤的——切記安疗,因為盡快這個觀點和人們直覺相悖抛杨,但卻是非常重要的。
疑問:
?我已經(jīng)明白了認證機構的作用了荐类,但是我總覺得這件事說來說去還是一個死循環(huán)怖现。為了相信公鑰,就必須相信為改公鑰頒發(fā)證書的認證機構,但是我為什么要相信這個認證機構呢?就算另一個認證機構為它做證明屈嗤,那我為什么又要相信那個“另一個認證機構”呢环础?
回答:
?這個問題關系到“信任是如何產(chǎn)生的”這一本質(zhì)問題咧最。為什么我們要把錢存進銀行呢?為什么我們錢包里的鈔票能夠在商店里使用呢?為什么我們相信飯店里提供的食物是安全的呢祸穷?我們每天的生活還會遇到很多這樣的“某種程度上可信”的例子,那么這種“可信”的感覺到底是怎樣產(chǎn)生的呢愿棋?
?一言以蔽之迟郎,就是“感覺貌似是可信的”,“從經(jīng)驗上看是可信的”這一類理由透硝。我們之所以信任某家銀行狰闪,是因為電視和報紙等眾多媒體上都能看到它的名字和評價,才會讓人產(chǎn)生可信的感覺濒生。
?認證機構是否讓人感到可信埋泵,和銀行也是一樣的。如果各種媒體都報道過某家認證機構罪治,而且說這家認證機構的業(yè)務非常正規(guī)丽声,那么這家認證機構就會讓人覺得可信。對于公司內(nèi)部的認證機構觉义,只要公司發(fā)出過官方通知雁社,而且你的上司也跟你說“這個就是我們公司的認證機構”,那么它對就是可信的晒骇。如果一個陌生人通過郵件發(fā)給你一個地址霉撵,就算上面寫著“這個還是某公司的認證機構”,我們也不能相信洪囤。
?在能夠處理政事的電子郵件軟件和Web瀏覽器中徒坡,已經(jīng)包含了一些有名的認證機構的證書,我們在平常使用時也不會再自行檢查那些軟件中已經(jīng)內(nèi)置的證書瘤缩,這是因為我們信任這個軟件的作者喇完,我們會認為有名的軟件應該不會嵌入一些惡意認證機構的證書。
?通過上面的思考我們可以看出剥啤,即便認證技術是具有層級結(jié)構的锦溪,但實際上支撐“信任”關系的也并不只是單純的層級關系而已。不管證書的鏈條是否具有層級結(jié)構府怯,我們只所以信任某個認證機構刻诊,是因為那是我們基于多個可信的情報源所組做出的判斷。
該系列的主要內(nèi)容來自《圖解密碼技術第三版》
我只是知識的搬運工
文章中的插圖來源于原著