數(shù)字簽名是為了確保信件信息未被篡改靶剑,數(shù)字證書是為了確保獲得的公鑰合法。
數(shù)字簽名
數(shù)字簽名的目的是保證收件人能夠確定此信件的來源正確并且未被篡改過压怠。
數(shù)字簽名的流程如下:
首先發(fā)件人使用HASH函數(shù)眠冈,生成了信件的摘要(Digest)
發(fā)件人使用自己的私鑰對(duì)摘要進(jìn)行加密,從而生成了此封信件的數(shù)字簽名(Signature)
發(fā)件人將此數(shù)字簽名附在信件中菌瘫,發(fā)送給收件人
收件人收到信件后蜗顽,使用公鑰對(duì)數(shù)字簽名進(jìn)行解密,得到了信件摘要(Digest)雨让,從而證明了此信件確實(shí)是由發(fā)件人寄出的(公鑰正確的前提下)雇盖。
收件人再對(duì)信件內(nèi)容進(jìn)行HASH,將得到的結(jié)果與上一步的Digest進(jìn)行對(duì)比栖忠,如果相同則證明此信件未被篡改過崔挖。
數(shù)字簽名的流程中,有一步存在風(fēng)險(xiǎn)庵寞。那就是收件人獲得的公鑰未必正確狸相。為了確保收件人持有的公鑰是正確的,因此引入了數(shù)字證書的概念捐川。
數(shù)字證書
數(shù)字證書是證書中心(CA脓鹃,certificate authority)為公鑰頒發(fā)的憑證。證書中心(CA)用自己的私鑰古沥,對(duì)發(fā)件人的公鑰和一些相關(guān)信息一起加密瘸右,生成"數(shù)字證書"(Digital Certificate)。
數(shù)字證書的流程如下:
發(fā)件人向CA申請(qǐng)數(shù)字證書岩齿,證書中包含了發(fā)件人的個(gè)人信息太颤,證書的信息,發(fā)件人的公鑰
發(fā)件人拿到數(shù)字證書以后盹沈,將簽名和數(shù)字證書同時(shí)附在信件中
收件人收到信件后龄章,使用CA的公鑰解開數(shù)字證書,就可以獲得真實(shí)的公鑰了
數(shù)字證書和HTTPS
HTTPS實(shí)際上就是HTTP協(xié)議和SSL/TSL協(xié)議的組合,可以把HTTPS大致理解為“HTTP over SSL”或“HTTP over TSL”瓦堵。關(guān)于它們的相關(guān)介紹基协,可以參考這篇文章。對(duì)于HTTPS我們應(yīng)該有以下幾個(gè)認(rèn)知:
1)使用HTTPS傳輸數(shù)據(jù)是安全的菇用,因?yàn)閿?shù)據(jù)都是被加密傳輸?shù)模?/p>
2)使用HTTPS需要在服務(wù)器端配置密鑰對(duì)澜驮;
3)使用HTTPS需要花錢找專業(yè)的權(quán)威機(jī)構(gòu)進(jìn)行CA證書的簽發(fā)。
那么使用HTTPS與網(wǎng)站服務(wù)器進(jìn)行交互的流程和原理到底是怎樣的呢惋鸥?讓我們先以逆向思考的方式來進(jìn)行說明:
我們說過杂穷,公鑰加密/非對(duì)稱加密方式雖然安全,但是由于密鑰過長卦绣,加密和解密速度都遠(yuǎn)遠(yuǎn)低于對(duì)稱加密耐量。因此,出于對(duì)性能方面的考慮滤港,HTTPS并不是把所有傳輸?shù)臄?shù)據(jù)都使用公鑰加密的方式進(jìn)行機(jī)密性的保護(hù)廊蜒,而是繼續(xù)使用對(duì)稱加密的方式來加密數(shù)據(jù)。還有一個(gè)原因就是溅漾,使用公鑰機(jī)密算法來保證數(shù)據(jù)機(jī)密性的話山叮,需要通信雙方都要有密鑰對(duì)兒,否則總有一方發(fā)出的數(shù)據(jù)是能被對(duì)方公布的公鑰解密的添履。
既然時(shí)使用對(duì)稱加密的方式加密數(shù)據(jù)屁倔,就需要有一個(gè)通信雙方都知道的加解密所使用的密鑰。HTTPS是通過上面提到的密鑰交換技術(shù)來動(dòng)態(tài)協(xié)商這個(gè)密鑰的暮胧,實(shí)際上就是由客戶端生成一個(gè)隨機(jī)密鑰锐借,然后發(fā)送給服務(wù)器端,這樣就解決了密鑰的管理問題往衷。
既然說HTTPS是安全的钞翔,那么客戶端生成的這個(gè)隨機(jī)密鑰肯定不能以明文的方式發(fā)送給服務(wù)器端啊。是的炼绘,當(dāng)客戶端以https的方式訪問一個(gè)站點(diǎn)時(shí)嗅战,該站點(diǎn)會(huì)自動(dòng)下發(fā)其公鑰信息“沉粒客戶端會(huì)使用這個(gè)公鑰對(duì)產(chǎn)生的隨機(jī)密鑰進(jìn)行加密,然后傳送給服務(wù)器端疟呐。服務(wù)器端以自己的私鑰對(duì)這個(gè)密文進(jìn)行解密脚曾,然后得到這個(gè)密鑰的明文內(nèi)容。至此启具,客戶端與服務(wù)端用于對(duì)稱加密和解密的密鑰協(xié)商與傳輸工作已經(jīng)安全的完成了本讥。
那么要通過網(wǎng)絡(luò)獲取服務(wù)器端的公鑰信息,那么怎么驗(yàn)證該公鑰信息的合法性呢?我們上面說過拷沸,不是所有問題都能依賴技術(shù)來解決的色查。這里要驗(yàn)證公鑰信息的合法性就要依靠CA證書簽發(fā)機(jī)構(gòu)了,網(wǎng)站服務(wù)的提供者必須找一個(gè)大家都信任的機(jī)構(gòu)來對(duì)他提供的公鑰進(jìn)行簽名撞芍,用戶得到一個(gè)網(wǎng)站下發(fā)的公鑰后看到有這個(gè)機(jī)構(gòu)的簽名就認(rèn)為這個(gè)公鑰是合法的秧了,是可信賴的。
那么CA機(jī)構(gòu)的簽名要以什么樣的形式來提供呢序无?實(shí)際上網(wǎng)站服務(wù)器下發(fā)給客戶端(通常是瀏覽器)的公鑰已經(jīng)不僅僅是密鑰對(duì)兒中公鑰的內(nèi)容了验毡,而是包含了證書簽發(fā)機(jī)構(gòu)寫入的其他信息的CA證書。這個(gè)CA證書中包括證書簽發(fā)機(jī)構(gòu)的標(biāo)識(shí)和公鑰的數(shù)據(jù)指紋帝嗡,當(dāng)然還有包含網(wǎng)站服務(wù)提供者的公鑰信息以及證書到期時(shí)間等等晶通。但是,我們前面提到過哟玷,單向加密只能保證數(shù)據(jù)的完整性狮辽,不能保證數(shù)據(jù)機(jī)密性。CA證書的偽造者完全可以偽造公鑰信息并生成相應(yīng)的數(shù)據(jù)指紋巢寡,然后發(fā)送給用戶隘竭。那么現(xiàn)在的問題就變成了要驗(yàn)證CA證書中公鑰的合法性以及CA證書提供者的身份了。貌似問題只是轉(zhuǎn)移了讼渊,而沒有被解決动看。
其實(shí)每個(gè)CA證書的簽發(fā)機(jī)構(gòu)也都有自己的密鑰對(duì)兒,他們放在CA證書中的公鑰的數(shù)據(jù)指紋時(shí)通過自己的私鑰加密過的爪幻,而這些CA證書簽發(fā)機(jī)構(gòu)的公鑰是被各瀏覽器廠商內(nèi)置在瀏覽器內(nèi)部的菱皆。當(dāng)瀏覽器接收到某網(wǎng)站服務(wù)器下發(fā)的CA證書后會(huì)根據(jù)CA證書中簽發(fā)機(jī)構(gòu)的標(biāo)識(shí)來讀取瀏覽器內(nèi)置的相應(yīng)CA簽發(fā)機(jī)構(gòu)的公鑰信息,通過這個(gè)公鑰信息對(duì)公鑰數(shù)據(jù)指紋的密文進(jìn)行解密就可以得到CA證書中包含的公鑰信息的真實(shí)數(shù)據(jù)指紋挨稿。瀏覽器再通過單向加密的方式自己計(jì)算一次CA證書中包含的公鑰信息的數(shù)據(jù)指紋仇轻,兩個(gè)數(shù)據(jù)指紋一致則說明這個(gè)CA證書確實(shí)是該CA機(jī)構(gòu)簽發(fā)的,同時(shí)也證明了CA證書中的公鑰信息沒有被篡改過奶甘。至此篷店,所有的問題就都解決了。
現(xiàn)在我們?cè)賮硪哉5捻樞蛎枋鲆幌率褂肏TTPS與網(wǎng)站服務(wù)器進(jìn)行交互的過程:
1)瀏覽器A與網(wǎng)站服務(wù)器B通過三次握手后建立網(wǎng)絡(luò)連接臭家。
2)瀏覽器A告訴網(wǎng)站服務(wù)器B:我想跟你通過HTTPS協(xié)議進(jìn)行秘密交流疲陕。
3)網(wǎng)站服務(wù)器B把包含自己公鑰信息的CA證書下發(fā)給瀏覽器A,并告訴瀏覽器A這個(gè)CA證書里有我的公鑰信息钉赁,你決定一個(gè)對(duì)稱加密使用的秘鑰串蹄殃,然后通過這個(gè)公鑰加密后發(fā)送給我。
4) 瀏覽器A接收到網(wǎng)站服務(wù)器B下發(fā)的CA證書后你踩,對(duì)這個(gè)CA證書的及其包含的公鑰信息的合法性表示懷疑诅岩。于是根據(jù)CA證書中包含的證書簽發(fā)機(jī)構(gòu)的標(biāo)識(shí)找到自身內(nèi)置的該簽發(fā)機(jī)構(gòu)的公鑰對(duì)CA證書中公鑰的數(shù)據(jù)指紋進(jìn)行解密讳苦,然后再自己計(jì)算一下CA證書中公鑰的數(shù)據(jù)指紋,對(duì)了一下這兩個(gè)數(shù)據(jù)指紋是一致的吩谦。瀏覽器A放心了鸳谜,知道這個(gè)CA證書是合法的,CA證書中的公鑰也沒有被篡改過式廷。
5)然后瀏覽器A通過通過密鑰協(xié)商技術(shù)產(chǎn)生了一個(gè)隨機(jī)的字符串作為與網(wǎng)站服務(wù)器B進(jìn)行秘密通信的密鑰咐扭,并把這個(gè)密鑰通過CA證書中包含的公鑰進(jìn)行加密后發(fā)送給網(wǎng)站服務(wù)器B。
6)網(wǎng)站服務(wù)器B接收到密文格式的密鑰后懒棉,通過自己的私鑰進(jìn)行解密得到密鑰的明文內(nèi)容草描。
7)瀏覽器A和網(wǎng)站服務(wù)器B開始了秘密交流。