看過很多次數(shù)字證書的知識(shí),總是看了忘,忘了再看,看了又忘,是時(shí)候好好總結(jié)一下了。
感謝敏捷的水大哥,講得很生動(dòng)很透徹。但我覺得也有不足的地方,那就是對指紋,指紋算法,簽名,簽名算法這幾個(gè)概念沒有梳理得很透徹。
簽名與加密
在這里,首先要說一下簽名和加密的知識(shí)。這里主要解釋一下簽名,簽名就是在信息的后面再加上一段內(nèi)容,可以證明信息沒有被修改過,怎么樣可以達(dá)到這個(gè)效果呢?一般是對信息做一個(gè)hash計(jì)算得到一個(gè)hash值,注意,這個(gè)過程是不可逆的,也就是說無法通過hash值得出原來的信息內(nèi)容。在把信息發(fā)送出去時(shí),把這個(gè)hash值加密后做為一個(gè)簽名和信息一起發(fā)出去。 接收方在收到信息后,會(huì)重新計(jì)算信息的hash值,并和信息所附帶的hash值(解密后)進(jìn)行對比,如果一致,就說明信息的內(nèi)容沒有被修改過,因?yàn)檫@里hash計(jì)算可以保證不同的內(nèi)容一定會(huì)得到不同的hash值,所以只要內(nèi)容一被修改,根據(jù)信息內(nèi)容計(jì)算的hash值就會(huì)變化。一般來說,我們的項(xiàng)目里面就是這么做的。
先讓我們來考慮一個(gè)問題?假如不懷好意的人修改信息內(nèi)容的同時(shí)也修改hash值,從而讓它們可以相匹配。為了防止這種情況發(fā)生,我們可以做到的就是為我們的簽名做升級,那就是對簽名加密,然后連同我們的信息一起發(fā)送。
中間人攻擊
先來看看中間人攻擊的概念。假如劉冬和黃麗之間要互換小情書,總要有一個(gè)信使,那就是張叔叔。這個(gè)人可能就是中間人,對所加密對內(nèi)容進(jìn)行攻擊。下面來看看步驟:
以上的步驟是原文的解釋,我認(rèn)為是錯(cuò)的,應(yīng)該改成下面的說法:
數(shù)字證書
那么張叔叔要讓冬冬相信他給的公鑰就是麗麗的公鑰,那么他可以開一個(gè)證明,比如找權(quán)威機(jī)構(gòu)“小陳”給開個(gè)介紹信,介紹信上給加個(gè)公章。那么這里的介紹信就是數(shù)字證書, 公章就是數(shù)字簽名, 那么”小陳”就是頒發(fā)證書的機(jī)構(gòu)CA(Certificate Authority),也就是證書授權(quán)中心。
CA: CA 是“Certificate Authority”的縮寫,也叫“證書授權(quán)中心”。
它是負(fù)責(zé)管理和簽發(fā)證書的第三方機(jī)構(gòu),就好比例子里面的“小陳”。一般來說,CA 必須是大家都信任的、認(rèn)可的。因此它必須具有足夠的權(quán)威性。只有冬冬和麗麗都信任的人才能來證明。
CA證書: CA 證書,就是CA頒發(fā)的證書。
證書之間的信任關(guān)系: 用一個(gè)證書來證明另一個(gè)證書是真實(shí)可信。
證書信任鏈: 證書之間的信任關(guān)系,是可以嵌套的。比如,A 信任 A1,A1 信任 A2,A2 信任 A3……,這就是證書的信任鏈。只要你信任鏈上的第一個(gè)證書,那后續(xù)的證書,都是可以信任的。
根證書(Root Certificate): 下圖,處于最頂上的樹根位置的那個(gè)證書,就是“根證書”。除了根證書,其它證書都要依靠上一級的證書來證明自己。那誰來證明“根證書”?根證書自己證明自己,這時(shí)候我們用戶就需要自己選擇是否相信某個(gè)根證書。根證書是整個(gè)證書體系安全的根本。如果某個(gè)證書體系中,根證書不再可信了,那么所有被根證書所信任的其它證書,也就不再可信了。
證書內(nèi)容
我們來看看國內(nèi)百度的證書,點(diǎn)擊綠色瀏覽器綠色的鎖就可以看到證書。
1 . 組織 (證書的發(fā)布機(jī)構(gòu))
指出是什么機(jī)構(gòu)發(fā)布的這個(gè)證書,也就是指明這個(gè)證書是哪個(gè)公司創(chuàng)建的(只是創(chuàng)建證書,不是指證書的使用者)。對于上面的這個(gè)證書來說,就是指”GlobalSign nv-sa”這個(gè)機(jī)構(gòu)。
2 . Public key (公鑰)
首先,我們先給出自己論斷,公鑰就是用來對消息進(jìn)行加密的,但是公鑰在數(shù)字證書里面充當(dāng)什么角色呢?這里的公鑰通俗一點(diǎn)說留給冬冬和麗麗之間通信用的,跟我們的數(shù)字證書認(rèn)證關(guān)聯(lián)不大。
3 . Thumbprint, Thumbprint algorithm (指紋以及指紋算法)
這個(gè)是用來保證證書的完整性的,也就是說確保證書沒有被修改過,其原理就是在發(fā)布證書時(shí),發(fā)布者根據(jù)指紋算法(一個(gè)hash算法)計(jì)算整個(gè)證書的hash值(指紋)并和證書放在一起,這個(gè)hash值就是我們在上面所說的hash串。使用者在打開證書時(shí),自己也根據(jù)指紋算法計(jì)算一下證書的hash值(指紋),如果兩者一致,就說明證書沒有被修改過,因?yàn)樽C書的內(nèi)容被修改后,根據(jù)證書的內(nèi)容計(jì)算的出的hash值(指紋)是會(huì)變化的。 注意,這個(gè)指紋會(huì)使用CA這個(gè)證書機(jī)構(gòu)的私鑰用簽名算法(Signature algorithm)加密后和證書放在一起,只有用CA的公鑰才能解開這個(gè)簽名。
所以在這里,要非常明確指紋和指紋算法的區(qū)別。指紋算法是指一種hash的方法,是一種加密的算法(我們一般使用MD5或者SHA1,而且一般沒有秘鑰,所以是不可逆的。指紋是指數(shù)字證書內(nèi)容的一個(gè)摘要。這兩樣?xùn)|西合起來的效果是保證證書內(nèi)容不被修改。
數(shù)字證書保證身份認(rèn)證的過程
首先是申請證書:
1. baidu.com 向GlobalSign nv-sa) 申請證書
2. GlobalSign nv-sa 生成一對公鑰A(上文所說的Public key,給客戶用的)和私鑰B(留給baidu)。
3. GlobalSign nv-sa有自己的公鑰C和私鑰D
4. GlobalSign nv-sa 把Issuer, 公鑰A, Subject(一般是網(wǎng)站的域名),Valid from,Valid to等信息以明文的形式寫到證書里面,然后用一個(gè)指紋算法(SHA1或者M(jìn)D5)計(jì)算出這些數(shù)字證書內(nèi)容的一個(gè)指紋(摘要),并把指紋和指紋算法用自己的私鑰D進(jìn)行加密,然后和證書的內(nèi)容一起發(fā)給baidu.com
用戶使用證書
1. 用戶訪問baidu.com 這個(gè)網(wǎng)站
2. baidu.com 把證書發(fā)給用戶
3. 瀏覽器讀取證書, 瀏覽器發(fā)現(xiàn)證書機(jī)構(gòu)是GlobalSign nv-sa,然后會(huì)在操作系統(tǒng)中受信任的發(fā)布機(jī)構(gòu)的證書中去找GlobalSign nv-sa的證書,如果找不到,那說明證書的發(fā)布機(jī)構(gòu)是個(gè)假的,或者不是被權(quán)威機(jī)構(gòu)認(rèn)證的,證書可能有問題,程序會(huì)給出一個(gè)錯(cuò)誤信息
4. 如果在系統(tǒng)中找到了GlobalSign nv-sa的證書,那么應(yīng)用程序就會(huì)從證書中取出GlobalSign nv-sa的公鑰C,然后對baidu.com公司的證書里面的指紋和指紋算法用這個(gè)公鑰C進(jìn)行解密,然后使用這個(gè)指紋算法計(jì)算baidu.com證書的指紋,將這個(gè)計(jì)算的指紋與放在證書中的指紋對比,如果一致,說明baidu.com的證書肯定沒有被修改過并且證書是GlobalSign nv-sa發(fā)布的,證書中的公鑰肯定是baidu.com的公鑰A, 然后我們就可以用這個(gè)公鑰A和baidu.com進(jìn)行通信,因?yàn)橹挥衎aidu.com 有私鑰B, 所以只有baidu.com才能解開信息。