
眾所周知,Https能夠加密信息,防止在數(shù)據(jù)傳輸過程中被惡意攔截和修改。所以那些安全級別高的服務(wù)都會使用Https協(xié)議。
Https簡介
在介紹Https之前先簡單的說一下Http,HTTP協(xié)議是我們使用比較多的協(xié)議,比如我們平時瀏覽網(wǎng)頁時候使用的一種協(xié)議。HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未經(jīng)過加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全。為了保證這些隱私數(shù)據(jù)能加密傳輸不被攔截和修改,于是網(wǎng)景公司設(shè)計了SSL(Secure Sockets Layer 安全套接字層)/TLS(Transport Layer Security,傳輸層安全協(xié)議)協(xié)議用于對HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進行加密,這樣Https就出現(xiàn)了,也就是說Https就是Http+SSL / TLS,也就是在Http的外層又加了一層處理加密信息的模塊。不管是客戶端還是服務(wù)端傳輸?shù)臄?shù)據(jù)都是經(jīng)過TLS進行加密后的數(shù)據(jù)。簡而言之,HTTPS是通過一次非對稱加密算法(如RSA算法)進行了協(xié)商密鑰的生成與交換,然后在后續(xù)通信過程中就使用協(xié)商密鑰進行對稱加密通信。下面通過下圖來詳細看一下Https的加密傳輸原理。

1.客戶端發(fā)起Https請求
這個就沒有什么可說的啦,就是在瀏覽器輸入url之后點擊回車發(fā)送請求就可以啦。此時客戶端發(fā)起的是明文的請求,客戶端將自己支持的一套加密規(guī)則和一個隨機數(shù)(Random_C)發(fā)送給服務(wù)器,以便能夠?qū)崿F(xiàn)數(shù)據(jù)的加密和解密。
2.服務(wù)器響應(yīng)
服務(wù)端在接收到客戶端的請求后,根據(jù)自己的加密規(guī)則從請求中選出一組加密算法和HASH算法,生成隨機數(shù),并將自己的身份信息以證書(CA)的形式返回給瀏覽器。大家可能對這個CA證書存在疑惑,什么是CA證書呢?這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰還是不太理解,可以把它想象成一把鑰匙和一個鎖頭,區(qū)別就是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人用這個鎖頭鎖住東西,然后發(fā)給你,由于只有你一個人有這把鑰匙,所以也就只有你才能看見用這個鎖鎖住的東西。在這里再說一下這個證書怎么獲得的?有兩種方式獲得這個證書,一種是自己制作,另一種是去相關(guān)的機構(gòu)去申請。區(qū)別就是第一種需要客戶端認證,第二種則不會彈出認證提示頁面。CA證書里面包含了服務(wù)器地址,加密公鑰,以及證書的頒發(fā)機構(gòu)等信息。這時服務(wù)器給客戶端的包括選擇使用的加密規(guī)則、CA證書、一個隨機數(shù)(Random_S)。
3.解析證書
當(dāng)客戶端接收到服務(wù)器給的這些信息的時候,進行解析證書,這部分工作就由客戶端的SSL/TLS來完成的,SSL/TLS介于應(yīng)用層和TCP層之間。應(yīng)用層和傳輸層進行交互的話需要先把數(shù)據(jù)傳輸?shù)絊SL/TLS層,SSL/TLS層對應(yīng)用層的數(shù)據(jù)進行加密,并增加自己的SSL頭再傳到應(yīng)用層(如下圖)。解析證書大概分為以下幾個步驟:

a.驗證公鑰是否有效,比如頒發(fā)機構(gòu),過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。
b.生成密碼,如果證書不存在問題,那么先生成一串隨機數(shù)密碼(Pre_master),之后用CA證書里的公鑰進行加密。
c.根據(jù)隨機數(shù)來計算協(xié)商秘鑰,就是用鎖頭(公鑰)將Random_C Random_S和Pre_master鎖在一起,只有有鑰匙(私鑰)才能看見被鎖住的內(nèi)容。
d.生成用于握手的信息,使用約定好的HASH計算握手消息,并使用協(xié)商密鑰及約定好的算法對消息進行加密。
4.向服務(wù)器發(fā)送加密信息
在這里客戶端將其產(chǎn)生的加密后的隨機數(shù)密碼和握手信息發(fā)送給服務(wù)器端,并通知服務(wù)器以后進行通信就要使用咱們約定好的算法和協(xié)商秘鑰。
5.服務(wù)器進行解密
現(xiàn)在用鎖頭鎖住的信息收到了,現(xiàn)在就要使用鑰匙打開鎖住的信息進行閱讀,具體的做法如下:
a.將公鑰加密的隨機數(shù)密碼進行解密成Pre_master。
b.計算協(xié)商秘鑰,也是根據(jù)Random_C Random_S和Pre_master來計算的。
c.解密握手信息,使用協(xié)商密鑰解密客戶端發(fā)來的握手消息,并驗證HASH是否與客戶端發(fā)來的一致。
d.再次生成握手信息,使用協(xié)商秘鑰以及已經(jīng)約定的加密方式來生成握手信息,準(zhǔn)備發(fā)送給客戶端。
6.將握手信息發(fā)送給客戶端
服務(wù)器端將生成的握手信息發(fā)送給客戶端,并通知客戶端這個加密信息是根據(jù)約定好的算法和協(xié)商秘鑰進行加密的。
7.客戶端解密信息
客戶端進行計算握手信息中的HASH值,并和服務(wù)端發(fā)來的HASH值進行比對,如果一致的話就代表握手過程結(jié)束,以后服務(wù)端和客戶端之間就可以根據(jù)約定好的算法和協(xié)商秘鑰進行數(shù)據(jù)加密來通信。
有的人就會問,客戶端和服務(wù)端在握手期間為什么要那么麻煩的加密解密進行傳輸???那是因為這樣做既保證了雙方都獲得了一致的密碼,并能夠正常的加密解密數(shù)據(jù),為后續(xù)真正數(shù)據(jù)的傳輸做一次測試。
附:Https一般使用的加密和HASH算法如下:
非對稱加密算法:RSA,DSA/DSS
對稱加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
希望通過這篇文章大家可以對Https有一定的了解。