HTTPS的概述
說到https協(xié)議,我們得先了解下http協(xié)(Hyper Text Transfer Protocol)議茧吊,即超文本傳輸協(xié)議。http協(xié)議是基于tcp/ip協(xié)議的應(yīng)用層協(xié)議,具有簡(jiǎn)單快速、無連接倡勇、無狀態(tài)的特點(diǎn),http請(qǐng)求的時(shí)候嘉涌,首先有tcp的三次握手建立連接妻熊,斷開的時(shí)候需要四次揮手,這個(gè)過程可以參考TCP/IP協(xié)議簇及TCP重傳機(jī)制洛心。
而另外一個(gè)需要了解的就是SSL/TSL協(xié)議固耘。SSL(Secure Sockets Layer, 安全套接字層),因?yàn)樵然ヂ?lián)網(wǎng)上使用的 HTTP 協(xié)議是明文的词身,存在很多缺點(diǎn),比如傳輸內(nèi)容會(huì)被偷窺(嗅探)和篡改番枚。 SSL 協(xié)議的作用就是在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密法严。TSL就是SSL標(biāo)準(zhǔn)化后的名字。
簡(jiǎn)單點(diǎn)說葫笼,HTTPS = HTTP + SSL/TSL深啤,就是HTTP的安全版本。
HTTPS的演變過程
我們知道路星,HTTP需要三次握手完成tcp連接后溯街,才能進(jìn)行數(shù)據(jù)的傳輸,斷開鏈接需要四次揮手洋丐,具體詳見TCP/IP協(xié)議簇及TCP重傳機(jī)制呈昔。那么HTTPS上述過程又是怎么樣的呢?首先我們看下演變過程友绝,HTTP三次握手建立連接后堤尾,數(shù)據(jù)完全裸奔,如下:
我們可以看到迁客,數(shù)據(jù)完全裸奔郭宝,很容易被黑客劫持,那我們加密吧掷漱,如下:
這樣也有缺點(diǎn):
(1)不同的客戶端粘室、服務(wù)器數(shù)量龐大,所以雙方都需要維護(hù)大量的密鑰卜范,維護(hù)成本很高衔统;
(2)因每個(gè)客戶端、服務(wù)器的安全級(jí)別不同,密鑰極易泄露缰冤。
就有接下來的非對(duì)稱加密版本犬缨,如下:
這樣做同樣也有缺點(diǎn):(1)公鑰是公開的(也就是黑客也會(huì)有公鑰),所以第 5 步私鑰加密的信息棉浸,如果被黑客截獲怀薛,其可以使用公鑰進(jìn)行解密,獲取其中的內(nèi)容迷郑;(2)非對(duì)稱加密是非常消耗性能的枝恋。
接下來就有了改良版本:
大致過程就是:
客戶端對(duì)稱密鑰A通過公鑰加密傳給服務(wù)端,說我們后續(xù)通訊的內(nèi)容就拿對(duì)稱密鑰A加密吧嗡害,服務(wù)端用私鑰解密拿到對(duì)稱密鑰A焚碌,發(fā)送一條消息“好的”,這條消息就是通過對(duì)稱密鑰A加密的霸妹,然后就是后續(xù)的通信了十电。
這樣同樣也有缺點(diǎn),服務(wù)端怎么將公鑰傳給客戶端呢叹螟?客戶端又怎么確認(rèn)對(duì)方就是服務(wù)端呢鹃骂?這就是終極版大招,SSL證書:
客戶端在接受到服務(wù)端發(fā)來的SSL證書時(shí)罢绽,會(huì)對(duì)證書的真?zhèn)芜M(jìn)行校驗(yàn)畏线,以瀏覽器為例說明如下:
(1)首先瀏覽器讀取證書中的證書所有者、有效期等信息進(jìn)行一一校驗(yàn)良价;
(2)瀏覽器開始查找操作系統(tǒng)中已內(nèi)置的受信任的證書發(fā)布機(jī)構(gòu)CA寝殴,與服務(wù)器發(fā)來的證書中的頒發(fā)者CA比對(duì),用于校驗(yàn)證書是否為合法機(jī)構(gòu)頒發(fā)明垢;
(3)如果找不到蚣常,瀏覽器就會(huì)報(bào)錯(cuò),說明服務(wù)器發(fā)來的證書是不可信任的袖外;
(4)如果找到史隆,那么瀏覽器就會(huì)從操作系統(tǒng)中取出 頒發(fā)者CA 的公鑰,然后對(duì)服務(wù)器發(fā)來的證書里面的簽名進(jìn)行解密得到hash值曼验;
(5)瀏覽器使用相同的hash算法計(jì)算出服務(wù)器發(fā)來的證書的hash值泌射,將這個(gè)計(jì)算的hash值與證書中簽名做對(duì)比;
(6)對(duì)比結(jié)果一致鬓照,則證明服務(wù)器發(fā)來的證書合法熔酷,沒有被冒充;
(7)此時(shí)瀏覽器就可以讀取證書中的公鑰豺裆,用于后續(xù)加密了拒秘;
HTTPS建立連接的過程:
(1)這一步号显,就是相當(dāng)于我們?cè)跒g覽器上輸入url回車的過程。這個(gè)時(shí)候?yàn)g覽器或者客戶端(接下來統(tǒng)一為客戶端)會(huì)把我們客戶端支持的加密算法Cipher Suite(密鑰算法套件)帶給服務(wù)端躺酒。
服務(wù)端發(fā)送證書(公鑰)給客戶端
(2)服務(wù)端接收Cipher后押蚤,和自己支持的加密算法進(jìn)行比對(duì),如果不符合羹应,則斷開連接揽碘。否則,服務(wù)端會(huì)把符合的算法和證書發(fā)給客戶端园匹,包括證書時(shí)間雳刺、證書日期、證書頒發(fā)的機(jī)構(gòu)裸违。
(3)客戶端驗(yàn)證證書掖桦,包括頒發(fā)證書的機(jī)構(gòu)是否合法與是否過期,證書中包含的網(wǎng)站地址是否與正在訪問的地址一致等
(4)驗(yàn)證通過后(或者用戶接受了不信任的證書)供汛,客戶端會(huì)生成一個(gè)隨機(jī)字符串枪汪,然后用服務(wù)端的公鑰進(jìn)行加密。這里就保證了只有服務(wù)端才能看到這串隨機(jī)字符串(因?yàn)榉?wù)端擁有公鑰對(duì)應(yīng)的私鑰紊馏,RSA解密料饥,可以知道客戶端的隨機(jī)字符串)。
(5)生成握手信息 用約定好的HASH算法朱监,對(duì)握手信息進(jìn)行取HASH,然后用隨機(jī)字符串加密握手信息和握手信息的簽名HASH值原叮,把結(jié)果發(fā)給服務(wù)端赫编。這里之所以要帶上握手信息的HASH是因?yàn)椋乐剐畔⒈淮鄹姆芰ァH绻畔⒈淮鄹睦匏停敲捶?wù)端接收到信息進(jìn)行HASH時(shí),就會(huì)發(fā)現(xiàn)HASH值和客戶端傳回來的不一樣唯欣。這里就保證了信息不會(huì)被篡改嘹吨。
(6)服務(wù)端接收到加密信息后,首先用私鑰解密得到隨機(jī)字符串境氢。然后用隨機(jī)字符串解密握手信息蟀拷,獲得握手信息和握手信息的HASH值,服務(wù)端對(duì)握手信息進(jìn)行HASH萍聊,比對(duì)客戶端傳回來的HASH问芬。如果相同,則說明信息沒有被篡改寿桨。
服務(wù)端驗(yàn)證完客戶端的信息以后此衅,同樣使用隨機(jī)字符串加密握手信息和握手信息的HASH值發(fā)給客戶端。
(7)客戶端接收到服務(wù)端發(fā)回來的握手信息后,用一開始生成的隨機(jī)字符串對(duì)密文進(jìn)行解密挡鞍,得到握手信息和握手信息的HASH值骑歹,像一步服務(wù)端驗(yàn)證一樣對(duì)握手信息進(jìn)行校驗(yàn),校驗(yàn)通過后墨微,握手完畢道媚。從這里開始,客戶端和服務(wù)端的通信就使用那串隨機(jī)字符串進(jìn)行AES對(duì)稱加密通信欢嘿。
對(duì)稱密鑰生成的過程
(1)首先衰琐,客戶端利用CA數(shù)字證書實(shí)現(xiàn)身份認(rèn)證,利用非對(duì)稱加密協(xié)商對(duì)稱密鑰炼蹦。
(2)客戶端會(huì)向服務(wù)器傳輸一個(gè)“pubkey”隨機(jī)數(shù)羡宙,服務(wù)器收到之后,利用特定算法生成另外一個(gè)“pubkey”隨機(jī)數(shù)掐隐,客戶端利用這兩個(gè)“pubkey”隨機(jī)數(shù)生成一個(gè) pre-master 隨機(jī)數(shù)狗热。
(3)客戶端利用自己在 client hello 里面?zhèn)鬏數(shù)碾S機(jī)數(shù) random_C,以及收到的 server hello 里面的隨機(jī)數(shù) random_S虑省,外加 pre-master 隨機(jī)數(shù)匿刮,利用對(duì)稱密鑰生成算法生成 對(duì)稱密鑰enc_key:enc_key=Fuc(random_C, random_S, Pre-Master)
驗(yàn)證總結(jié)
使用RSA非對(duì)稱算法廉丽,服務(wù)端向客戶端發(fā)送公鑰承耿,公鑰包含了域名璃氢、頒發(fā)機(jī)構(gòu)黄痪、過期日期郑临。保證了公鑰的合法性和服務(wù)端的身份正確性(而不會(huì)被黑客冒充)
客戶端向第三方驗(yàn)證公鑰的合法性缅叠,驗(yàn)證通過后向服務(wù)端約定對(duì)稱加密的隨機(jī)字符號(hào)逆航。保證了隨機(jī)字符串只有通信雙方知道穴豫。
接下來的通信就使用這個(gè)隨機(jī)字符號(hào)進(jìn)行加密通信怀大。因?yàn)殡S機(jī)字符串只有雙方知道纱兑,所以信息不會(huì)被截獲。
iOS的HTTPS證書的驗(yàn)證方式見iOS開發(fā)HTTPS實(shí)現(xiàn)之信任SSL證書和自簽名證書
歡迎指正;琛G鄙鳌!
參考:
HTTPS 原理詳解
深入揭秘HTTPS安全問題&連接建立全過程