前言:前段時(shí)間被問到HTTPS的相關(guān)問題,由于離看相關(guān)問題的時(shí)間很久了再加上自己也沒有實(shí)踐過,很多點(diǎn)沒有說出來,因此特地又溫習(xí)了一遍相關(guān)的知識(shí),特此記錄下來以加強(qiáng)記憶
什么是HTTPS
我們知道HTTP是一種無狀態(tài)、明文的網(wǎng)絡(luò)傳輸協(xié)議,目前我們?yōu)g覽的很多網(wǎng)站都是基于這種協(xié)議進(jìn)行客戶端和服務(wù)端信息交互的。但是由于HTTP明文傳輸?shù)奶攸c(diǎn),很容易導(dǎo)致信息在傳輸過程中被截獲甚至被篡改造成嚴(yán)重的后果。在信息安全挑戰(zhàn)越來越頻繁的情景下,信息保護(hù)的需求越來越急迫。目前保護(hù)信息安全最常見和普及的就是加密技術(shù),根據(jù)加密對(duì)象的不同可以分為兩種。
-
通信加密
顧名思義就是對(duì)通信進(jìn)行加密,HTTP協(xié)議本身沒有加密的機(jī)制,但是可以通過和SSL的組合使用來達(dá)到加密通信通道的效果,在使用SSL建立安全的通信線路之后就可以在在這條線路上使用HTTP協(xié)議通信了,于SSL組合使用的HTTP協(xié)議就被成為HTTPS。 -
內(nèi)容加密
另一種加密的方式就是對(duì)通信的內(nèi)容本身進(jìn)行加密,即把HTTP報(bào)文里面的內(nèi)容加密處理后在進(jìn)行傳輸,無論是客戶端還是服務(wù)端都需要對(duì)報(bào)文進(jìn)行加密后再發(fā)送,同理兩端接收到的都是加密之后的報(bào)文,需要先對(duì)報(bào)文進(jìn)行解密才能拿到真正的報(bào)文內(nèi)容。這就要求客戶端和服務(wù)器端都要具有加解密的能力。這種方式可以防止通信內(nèi)容被竊取但是無法阻止內(nèi)容被篡改。
進(jìn)一步了解前的準(zhǔn)備知識(shí)
加密算法
近代的加密方法中加密算法是公開的,而密鑰是保密的,通過這種方式得以保持加密算法的安全性。
對(duì)稱加密
加密解密使用同一個(gè)密鑰的加密方式稱之為對(duì)稱密鑰加密也被稱為共享密鑰加密。這種加密方式需要對(duì)密鑰特別保護(hù),只要密鑰被竊取,信息就會(huì)完全暴露。在互聯(lián)網(wǎng)環(huán)境下,很難保證共享密鑰的安全性,如果在發(fā)送共享密鑰的過程中通信被監(jiān)聽,密鑰就會(huì)落在攻擊者手中,那么信息加密也就失去了意義。非對(duì)稱加密
非對(duì)稱加密方法有兩個(gè)密鑰,一個(gè)是公開密鑰另一個(gè)是私有密鑰。公開密鑰可以隨意發(fā)布,任何人都可以獲取公開密鑰,私有密鑰只有信息接收方知道。
使用非對(duì)稱加密方式,發(fā)送的密文的一方使用接收方的公開密鑰進(jìn)行加密處理,接收方收到密文后再使用私有密鑰進(jìn)行解密。利用這種方式,不需要發(fā)送用來解密的私有密鑰,也就不需要擔(dān)心密鑰被攻擊者竊取。另外,想要根據(jù)密文和公開密鑰恢復(fù)原文是很困難的,就目前的技術(shù)看來說很難辦到,就算能做到,付出的價(jià)值也會(huì)讓攻擊者得不償失。但是非對(duì)稱加密相對(duì)對(duì)稱加密速度要慢很多。
簽名和證書
數(shù)字簽名
數(shù)字簽名就是在信息的后面再加上一段內(nèi)容,可以證明信息沒有被修改過,怎么樣可以達(dá)到這個(gè)效果呢?一般是對(duì)信息做一個(gè)HASH計(jì)算得到一個(gè)HASH值,注意,這個(gè)過程是不可逆的,也就是說無法通過HASH值得出原來的信息內(nèi)容。在把信息發(fā)送出去時(shí),把這個(gè)HASH值加密后做為一個(gè)簽名和信息一起發(fā)出去。 接收方在收到信息后,會(huì)重新計(jì)算信息的HASH值,并和信息所附帶的HASH值(解密后得到)進(jìn)行對(duì)比,如果一致,就說明信息的內(nèi)容沒有被修改過,因?yàn)檫@里HASH計(jì)算可以保證不同的內(nèi)容一定會(huì)得到不同的HASH值,所以只要內(nèi)容一被修改,根據(jù)信息內(nèi)容計(jì)算的HASH值就會(huì)變化。當(dāng)然,不懷好意的人也可以修改信息內(nèi)容的同時(shí)也修改HASH值,從而讓它們可以相匹配,為了防止這種情況,HASH值一般都會(huì)加密后(也就是簽名)再和信息一起發(fā)送,以保證這個(gè)HASH值不被修改數(shù)字證書
數(shù)字證書是由公認(rèn)的權(quán)威公正性第三方機(jī)構(gòu)(即CA中心)簽發(fā)的證書。數(shù)字證書一般包含以下主要內(nèi)容:
證書的發(fā)布機(jī)構(gòu)
證書的有效期
公鑰
證書所有者(Subject)
簽名所使用的算法
指紋以及指紋算法
數(shù)字證書的作用基本可以概括為:數(shù)字證書可以保證數(shù)字證書里的公鑰確實(shí)是這個(gè)證書的所有者(Subject)的,或者證書可以用來確認(rèn)對(duì)方的身份。
數(shù)字證書首先由證書的發(fā)布機(jī)構(gòu)制作發(fā)布具有一定的有效期限,過期后的證書不再具有安全效力。證書中的公鑰為證書發(fā)布機(jī)構(gòu)的公鑰,和證書的簽名、指紋一起作用來確定證書的完整性,確保證書沒有被篡改過。
為了保證證書的安全,證書發(fā)布機(jī)構(gòu)在發(fā)布證書之前會(huì)對(duì)整個(gè)證書做一次HASH計(jì)算(此處的HASH算法即為證書中的指紋算法),并對(duì)得出的HASH值(指紋)做一次簽名加密(證書發(fā)布機(jī)構(gòu)使用自己的私鑰以及證書中的簽名算法加密),并將簽名和證書放在一起發(fā)布。使用者在打開這個(gè)證書的時(shí)候會(huì)使用證書中的公鑰和簽名算法解出簽名加密的指紋,假設(shè)指紋為1,然后使用者會(huì)使用證書中聲明的指紋算法對(duì)整個(gè)證書做一次計(jì)算得出指紋2,最后比較指紋1和2是否相等,如果相等則可以保證證書完整性,證書沒有被中途篡改。
注意:以上只能證實(shí)證書的完整性,并不能保證證書被整個(gè)替換掉,所以為了解決這種問題,數(shù)字證書的發(fā)布機(jī)構(gòu)也有自己的證書來保證自己的真實(shí)性。那么證書發(fā)布機(jī)構(gòu)的證書是哪里來的呢?原來這種證書會(huì)默認(rèn)安裝在操作系統(tǒng)中,像微軟、蘋果等操作系統(tǒng)公司會(huì)根據(jù)一些權(quán)威安全機(jī)構(gòu)的評(píng)估選取一些信譽(yù)很好并且通過一定的安全認(rèn)證的證書發(fā)布機(jī)構(gòu),把這些證書發(fā)布機(jī)構(gòu)的證書默認(rèn)就安裝在操作系統(tǒng)里面了,并且設(shè)置為操作系統(tǒng)信任的數(shù)字證書。這些證書發(fā)布機(jī)構(gòu)自己持有與他自己的數(shù)字證書對(duì)應(yīng)的私鑰,他會(huì)用這個(gè)私鑰加密所有他發(fā)布的證書的指紋作為數(shù)字簽名。
HTTPS的工作流程
準(zhǔn)備階段
- 服務(wù)端
服務(wù)端把自己的公鑰登錄至數(shù)字證書發(fā)布機(jī)構(gòu),數(shù)字證書發(fā)布機(jī)構(gòu)使用自己的私鑰對(duì)服務(wù)端的公鑰做簽名加密并頒發(fā)此公鑰的證書。 - 客戶端
此處的客戶端一般是指瀏覽器,瀏覽器會(huì)事先內(nèi)置大部分權(quán)威機(jī)構(gòu)的公鑰數(shù)字證書。如果沒有該機(jī)構(gòu)的公鑰數(shù)字證書則需要去該機(jī)構(gòu)處下載安裝該證書,當(dāng)然這樣做需要承擔(dān)一定的風(fēng)險(xiǎn)。
通信階段
客戶端和服務(wù)端協(xié)商
- 客戶端通過發(fā)送Client Hello報(bào)文開始SSL通信。報(bào)文中 包含客戶端支持的 SSL 的指定版本、加密??件(Cipher Suite)??表,里面包含所支持使用的加密??算法及密鑰??長(zhǎng)度等。
- 服務(wù)端接收到客戶端所有的Cipher后與自身支持的對(duì)比,如果不支持則連接斷開,反之則會(huì)從中選出一種加密算法和HASH算法以證書的形式返回給客戶端,以Server Hello報(bào)文作為響應(yīng) ??。
- 之后服務(wù)端發(fā)送Certificate報(bào)文,報(bào)文中包含??公鑰??證書。
- 最后服務(wù)端發(fā)送Server Hello Done報(bào)文通知客戶端,最初??段的 SSL 握手協(xié)商??部分結(jié)束。
客戶端生成隨機(jī)密碼
- 客戶端檢查頒發(fā)證書的機(jī)構(gòu)是否合法與是否過期,證書中包含的網(wǎng)站地址是否與正在訪問的地址一致等。
- 如果證書驗(yàn)證通過,客戶端會(huì)生成一串隨機(jī)數(shù)即PreMaster Secret,然后用證書中的公鑰和加密算法對(duì)PreMaster Secret加密,以Client Key E??change報(bào)文形式發(fā)送給服務(wù)端。
- 用證書的HASH算法把握手消息取HASH值,然后用PreMaster Secret加密 “握手消息+握手消息HASH值”,以Change Cipher Spec報(bào)文形式發(fā)送給服務(wù)端,該報(bào)文會(huì)提示服務(wù)端在此報(bào)文之后的通信會(huì)??用Pre-master secret加密。
- 客戶端發(fā)送Finished報(bào)文,該報(bào)文包含??接??今全部報(bào)文的整體????校驗(yàn)值,這??握手協(xié)??是否能??成功,要以服務(wù)端是否能??正確解密該報(bào)文作為??判定標(biāo)準(zhǔn)。
服務(wù)端確認(rèn)隨機(jī)密碼
- 服務(wù)端拿到客戶端傳來的密文,用自己的私鑰取出PreMaster Secret,再用PreMaster Secret解密握手消息和握手消息的HASH值,并與自己計(jì)算的握手消息HASH值做對(duì)比確認(rèn)是否一致,如果一致則表明握手消息在傳輸過程中沒有被篡改,然后服務(wù)端同樣發(fā)送Change Cipher Spec形式的報(bào)文。
- 服務(wù)器同樣發(fā)送Finished報(bào)文。
正式通信
- 客戶端用隨機(jī)數(shù)解密報(bào)文并計(jì)算握手消息的HASH,如果與服務(wù)端發(fā)來的HASH一致則至此握手過程結(jié)束,SSL連接就??建立完成,之后所有的通信數(shù)據(jù)將由之前客戶端生成的隨機(jī)密碼利用對(duì)稱加密算法進(jìn)行加密。
- 開始進(jìn)行應(yīng)用??協(xié)議的通信,客戶端發(fā)送HTTP請(qǐng)求。
- 應(yīng)用??協(xié)議通信,即發(fā)送 HTTP 響應(yīng)。
- 最后由客戶端斷開??接,斷開??接時(shí),發(fā)送 close??_notify報(bào)文。
為什么需要數(shù)字證書
因?yàn)橛捎诩用芩惴ㄊ枪_的,大家都可以生成自己的公鑰和私鑰,為了防止攻擊者冒充服務(wù)端做中間人攻擊,就需要一種手段證明通信方是預(yù)期的安全對(duì)象,因此需要數(shù)字證書。如果沒有數(shù)字證書,攻擊者很容易做出如下例子的攻擊:
// 黑客截獲“客戶”發(fā)給“服務(wù)器”的消息
“客戶”->“黑客”:你好
// 黑客自己生成一對(duì)公鑰和私鑰,把公鑰發(fā)給“客戶”,自己保留私鑰
“黑客”->“客戶”:你好,我是服務(wù)器,這個(gè)是我的公鑰
“客戶”->“黑客”:向我證明你就是服務(wù)器
// 客戶收到“黑客”用私鑰加密的信息后,是可以用“黑客”發(fā)給自己的公鑰解密的,從而會(huì)誤認(rèn)為“黑客”是“服務(wù)器”
“黑客”->“客戶”:你好,我是服務(wù)器
為什么需要生成對(duì)稱密鑰通信
因?yàn)榉?wù)端的公鑰是公開的,如果服務(wù)端直接使用私鑰加密報(bào)文通信是無法保證報(bào)文能安全的到達(dá)客戶端的。而且非對(duì)稱加密的耗時(shí)較長(zhǎng),通信效率不如對(duì)稱加密。