一、背景
現(xiàn)在大多數(shù)的網(wǎng)站都升級(jí)為https協(xié)議了,包括百度、知乎等,當(dāng)然還包括對(duì)安全性要求高的支付業(yè)務(wù)和銀行業(yè)務(wù)都是用https。https相對(duì)于http的劣勢(shì)是,https建立連接需要多次握手,而且還要進(jìn)行RSA加密解密,這是個(gè)耗時(shí)的過(guò)程,那么為什么對(duì)安全性要求不高的網(wǎng)站也升級(jí)為https。那是因?yàn)閔ttp是用明文傳輸,在傳輸過(guò)程中,我們的信息可能會(huì)被篡改,或者會(huì)被第三方截取插入一些別的信息,比如說(shuō)廣告植入,這嚴(yán)重影響了用戶(hù)體驗(yàn)。
既然要升級(jí)為https協(xié)議,那就很有必要知道https的原理是什么,https是怎么保證信息只有通信雙方能解析而不被第三方截獲導(dǎo)致信息被竊取、篡改。
二、https驗(yàn)證原理
2.1 原理圖
下面是一張https建立連接的原理圖,下面會(huì)對(duì)每一步進(jìn)行說(shuō)明。

2.2 https建立連接過(guò)程
2.2.1 客戶(hù)端訪(fǎng)問(wèn)https連接
這一步,就是相當(dāng)于我們?cè)跒g覽器上輸入url回車(chē)的過(guò)程。這個(gè)時(shí)候?yàn)g覽器或者客戶(hù)端(接下來(lái)統(tǒng)一為客戶(hù)端)會(huì)把我們客戶(hù)端支持的加密算法Cipher Suite(密鑰算法套件)帶給服務(wù)端。
2.2.2 - 2.2.3 服務(wù)端發(fā)送證書(shū)(公鑰)給客戶(hù)端
服務(wù)端接收Cipher后,和自己支持的加密算法進(jìn)行比對(duì),如果不符合,則斷開(kāi)連接。否則,服務(wù)端會(huì)把符合的算法和證書(shū)發(fā)給客戶(hù)端,包括證書(shū)時(shí)間、證書(shū)日期、證書(shū)頒發(fā)的機(jī)構(gòu)。
2.2.4- 2.2.5 客戶(hù)端驗(yàn)證服務(wù)端的證書(shū)
1、客戶(hù)端驗(yàn)證證書(shū),包括頒發(fā)證書(shū)的機(jī)構(gòu)是否合法與是否過(guò)期,證書(shū)中包含的網(wǎng)站地址是否與正在訪(fǎng)問(wèn)的地址一致等
2、驗(yàn)證通過(guò)后(或者用戶(hù)接受了不信任的證書(shū)),客戶(hù)端會(huì)生成一個(gè)隨機(jī)字符串,然后用服務(wù)端的公鑰進(jìn)行加密。這里就保證了只有服務(wù)端才能看到這串隨機(jī)字符串(因?yàn)榉?wù)端擁有公鑰對(duì)應(yīng)的私鑰,RSA解密,可以知道客戶(hù)端的隨機(jī)字符串)。
3、生成握手信息 用約定好的HASH算法,對(duì)握手信息進(jìn)行取HASH,然后用隨機(jī)字符串加密握手信息和握手信息的簽名HASH值,把結(jié)果發(fā)給服務(wù)端。這里之所以要帶上握手信息的HASH是因?yàn)?,防止信息被篡改。如果信息被篡改,那么服?wù)端接收到信息進(jìn)行HASH時(shí),就會(huì)發(fā)現(xiàn)HASH值和客戶(hù)端傳回來(lái)的不一樣。這里就保證了信息不會(huì)被篡改。
2.2.6 - 2.2.7 服務(wù)端接收加密信息,解密得到客戶(hù)端提供的隨機(jī)字符串
服務(wù)端接收到加密信息后,首先用私鑰解密得到隨機(jī)字符串。然后用隨機(jī)字符串解密握手信息,獲得握手信息和握手信息的HASH值,服務(wù)端對(duì)握手信息進(jìn)行HASH,比對(duì)客戶(hù)端傳回來(lái)的HASH。如果相同,則說(shuō)明信息沒(méi)有被篡改。
服務(wù)端驗(yàn)證完客戶(hù)端的信息以后,同樣使用隨機(jī)字符串加密握手信息和握手信息的HASH值發(fā)給客戶(hù)端。
2.2.8 客戶(hù)端驗(yàn)證服務(wù)端返回的握手信息,完成握手
客戶(hù)端接收到服務(wù)端發(fā)回來(lái)的握手信息后,用一開(kāi)始生成的隨機(jī)字符串對(duì)密文進(jìn)行解密,得到握手信息和握手信息的HASH值,像一步服務(wù)端驗(yàn)證一樣對(duì)握手信息進(jìn)行校驗(yàn),校驗(yàn)通過(guò)后,握手完畢。從這里開(kāi)始,客戶(hù)端和服務(wù)端的通信就使用那串隨機(jī)字符串進(jìn)行AES對(duì)稱(chēng)加密通信。
2.3 驗(yàn)證總結(jié)
使用RSA非對(duì)稱(chēng)算法,服務(wù)端向客戶(hù)端發(fā)送公鑰,公鑰包含了域名、頒發(fā)機(jī)構(gòu)、過(guò)期日期。保證了公鑰的合法性和服務(wù)端的身份正確性(而不會(huì)被黑客冒充)
客戶(hù)端向第三方驗(yàn)證公鑰的合法性,驗(yàn)證通過(guò)后向服務(wù)端約定對(duì)稱(chēng)加密的隨機(jī)字符號(hào)。保證了隨機(jī)字符串只有通信雙方知道。
接下來(lái)的通信就使用這個(gè)隨機(jī)字符號(hào)進(jìn)行加密通信。因?yàn)殡S機(jī)字符串只有雙方知道,所以信息不會(huì)被截獲。
三、客戶(hù)端驗(yàn)證證書(shū)的合法性
為了驗(yàn)證證書(shū)的合法性,首先客戶(hù)端要知道一些合法的證書(shū)機(jī)構(gòu),這就是我們所說(shuō)的根證書(shū)。而根證書(shū)會(huì)保存在用戶(hù)的瀏覽器或者其它客戶(hù)端,像jdk的根證書(shū)列表。
當(dāng)然證書(shū)不可能只有幾個(gè)機(jī)構(gòu)進(jìn)行頒發(fā)的,所以證書(shū)的頒發(fā)是一級(jí)一級(jí)的??蛻?hù)端在驗(yàn)證證書(shū)也是一級(jí)一級(jí)往下驗(yàn)證。下面是阿里的證書(shū):

最頂級(jí)的VeriSign Class 3 Public Primary Certification Authori... 就是根證書(shū)了, 這個(gè)證書(shū)一般會(huì)保存在客戶(hù)端,在客戶(hù)端安裝時(shí)就有一組根證書(shū)了,如果服務(wù)端根證書(shū)在客戶(hù)端的信任列表中,那么就會(huì)向根證書(shū)驗(yàn)證二級(jí)證書(shū)的合法性,然后再向二級(jí)證書(shū)機(jī)構(gòu)驗(yàn)證三級(jí)證書(shū)的合法性,以此類(lèi)推。