http 具有相當(dāng)優(yōu)秀和出色的一面,但是事物皆有兩面性,他也有不足之處。
Http的不足
明文傳遞信息,容易遭監(jiān)聽。
不認(rèn)證通信方身份,容易遭遇偽裝。
無法證明報(bào)文完整性檢測,容易被篡改。
為了解決上述問題,需要在http中再加入加密處理和認(rèn)證等機(jī)制。我們把添加了加密以及認(rèn)證機(jī)制的http成為https。
https并非是應(yīng)用層的一種新協(xié)議,只是http通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)協(xié)議代替而已。
通常,http直接和tcp通信,當(dāng)使用ssl時(shí),則演變成先和ssl通信再有ssl和tcp通信了。
ssl是獨(dú)立于http的協(xié)議,所以不光是http協(xié)議,其他運(yùn)行在應(yīng)用層的smtp和telnet等協(xié)議均可配合ssl使用。
ssl的公開密鑰加密
ssl采用公開密鑰加密(Public-key cryptography)的加密處理方式。
首先讓我們先了解一下共享密鑰加密。共享密鑰加密過程,是加解密雙方使用同一把密鑰對數(shù)據(jù)進(jìn)行加密解密。
而使用共享密鑰加密的安全問題在于是否有第三人知道密鑰。這種加密也叫做對稱加密。
而公開密鑰加密很好的解決了這個(gè)問題。
公開密鑰加密使用一對非對稱的密鑰。一把叫做私有密鑰(private key),另一把叫做公開密鑰(public key)。顧名思義,私有密鑰不能讓其他任何人知道,而公開密鑰則可以隨意發(fā)布,任何人都可以獲得。
使用公開密鑰加密方式,發(fā)送密文的一方使用對方的公開密鑰進(jìn)行加密處理,對方收到被加密的信息后,再使用自己的私有密鑰進(jìn)行解密。利用這種方式,不需要發(fā)送用來解密的私有密鑰,也不必?fù)?dān)心密鑰被攻擊者竊聽而盜走。
https的混合加密
公開密鑰加密雖然安全性非常高,但是其加密解密過程,處理速度相對較慢。若對稱加密的密鑰能夠?qū)崿F(xiàn)安全交換,那么就可以使用效率非常高的共享密鑰加密了。
在交換密鑰緩解使用公開密鑰加密,之后建立通信交換信息階段使用共享密鑰加密。
證書
雖然加密環(huán)節(jié)已經(jīng)能保證安全了,但是還是有一個(gè)問題。那就是無法證明公開密鑰本身就是真的公鑰。
為了解決這個(gè)問題,數(shù)字證書認(rèn)證機(jī)構(gòu)CA(Certificate Authority)會頒發(fā)一個(gè)公鑰證書。
數(shù)字證書認(rèn)證機(jī)構(gòu)是一個(gè)通信雙方都信任的第三方機(jī)構(gòu)。首先服務(wù)器運(yùn)營人員會向CA遞交公開密鑰的申請。CA在審核通過之后,會用自己的私鑰對已申請的公鑰做數(shù)字簽名,然后分配給這個(gè)已簽名的公鑰,并將該公鑰放入公鑰證書后綁定起來。綁定起來的東西就叫做證書。CA的公鑰事先植入在了瀏覽器中??蛻舳四玫椒?wù)器的證書后,用CA的公鑰驗(yàn)證數(shù)字簽名,以確認(rèn)服務(wù)器公鑰的真實(shí)性。
https的安全通信步驟
為了更好的理解https,我們來總結(jié)一下https的通信步驟
1.瀏覽器向服務(wù)器發(fā)出加密通訊(Cient Hello)請求。報(bào)文中包涵客戶單支持的ssl指定版本,加密組建,所使用的算法及密鑰長度等等。
2.服務(wù)器可以進(jìn)行SSL通信的時(shí)候,會以Server Hello報(bào)文作為回應(yīng)。報(bào)文中包涵以下內(nèi)容,ssl版本和確認(rèn)使用的加密算法等。
3.服務(wù)器發(fā)送Certificate報(bào)文,報(bào)文包含公鑰證書。
4.最后服務(wù)器發(fā)送Server Hello Done,通知客戶端SSL握手協(xié)商結(jié)束。
5.SSL第一次握手完事后,客戶端發(fā)送Client Key Exchange報(bào)文作為回應(yīng)。報(bào)文中包涵通信加密中使用的隨機(jī)數(shù)(pre-master secret)。由客戶端使用rsahuozhe diffie-hellman等加密算法生成的。 此報(bào)文通過證書中的公鑰加密。
6.接著客戶端發(fā)送Change Cipher Spec報(bào)文。此報(bào)文告知服務(wù)器以后通信會都采用Pre-master secret進(jìn)行加密。
7.客戶端發(fā)送Finished報(bào)文,報(bào)文包含連接至今所有報(bào)文的整體校驗(yàn)值。第二次握手成功與否,是以服務(wù)器能否正確解析此報(bào)文為標(biāo)準(zhǔn)。
8.驗(yàn)證成功,服務(wù)器同樣發(fā)送Change Cipher Spec.
9.服務(wù)器發(fā)送Finished報(bào)文。
10.服務(wù)器和客戶端的Finished報(bào)文交換完畢之后,SSL鏈接建立完成。從此處開始應(yīng)用層協(xié)議。
11.斷開鏈接應(yīng)由客戶端發(fā)起,向服務(wù)器發(fā)送一個(gè)close_notify報(bào)文。這步之后再關(guān)閉與TCP的通信。