HTTP是Web中常見的通信方式,無狀態(tài),簡單易用。當然,它的不足之處也非常明顯:
- 通信使用明文,內容可能被竊聽
- 不驗證通信方的身份,有可能遭遇偽裝
- 無法證明報文的完整性,所以報文有可能被篡改
為了解決HTTP協(xié)議的痛點,采用通信加密的方式,繼而出現(xiàn)HTTPS協(xié)議。
1. HTTPS
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。
服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸?shù)臄?shù)據(jù)都是加密后的數(shù)據(jù)。

1.1 SSL加密
- SSL是Netscape公司所提出的安全保密協(xié)議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web服務器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數(shù)據(jù)傳輸
- SSL運行在TCP/IP層之上、應用層之下,為應用程序提供加密數(shù)據(jù)通道
- 采用了RC4、MD5以及RSA等加密算法,使用40 位的密鑰,適用于商業(yè)信息的加密。
- Netscape公司相應開發(fā)了HTTPS協(xié)議并內置于其瀏覽器中,HTTPS實際上就是SSL over HTTP,它使用默認端口443,而不是像HTTP那樣使用端口80來和TCP/IP進行通信。
- HTTPS協(xié)議使用SSL在發(fā)送方把原始數(shù)據(jù)進行加密,然后在接受方進行解密,加密和解密需要發(fā)送方和接受方通過交換共知的密鑰來實現(xiàn),因此,所傳送的數(shù)據(jù)不容易被網(wǎng)絡黑客截獲和解密。
加密技術有兩種:
- 公開密鑰加密(非對稱密鑰加密):加密算法是公開的,而密鑰是保密的.加密和解密都會用到密鑰(使用一對非對稱的密鑰,一把私鑰一把公鑰)。
- 共享密鑰加密(對稱密鑰加密):以共享密鑰方式加密時必須將密鑰也發(fā)給對方。
https采用共享密鑰加密和公開密鑰加密兩者并用的混合加密機制,具體加密方式參考第二節(jié)。
SSL不僅提供加密處理,而且使用證書,來確定對方的非偽裝的。
1.2 數(shù)字證書
證書是由值得信任的第三方機構頒發(fā),用以證明服務器和客戶端是實際存在的。

2. HTTPS 通信步驟
HTTP+加密+認證+完整性保護=HTTPS。上節(jié)提到,“https采用共享密鑰加密和公開密鑰加密兩者并用的混合加密機制”,解釋一下,就是用公開密鑰加密傳遞密鑰,用共享密鑰加密算法加密報文內容。
為什么HTTPS要采用混合加密呢?
因為公開密鑰加密的處理速度要遠遠慢于共享密鑰加密,所以,在通信最頻繁的環(huán)節(jié) - “報文加密”,采用了共享密鑰。那么,更加安全的公開密鑰加密,就非常適合“報文密鑰”的傳遞來。
具體加密,解密,驗證步驟如下:

客戶端發(fā)起HTTPS請求
用戶在瀏覽器里輸入一個https網(wǎng)址,然后連接到server的443端口(默認HTTP的端口號為80,HTTPS的端口號為443)。服務端的配置
采用HTTPS協(xié)議的服務器必須要有一套數(shù)字證書,可以自己制作,也可以向組織申請。區(qū)別就是自己頒發(fā)的證書需要客戶端驗證通過,才可以繼續(xù)訪問,而使用受信任的公司申請的證書則不會彈出提示頁面。
這套證書其實就是一對公鑰和私鑰。傳送證書
這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發(fā)機構,過期時間等等。客戶端解析證書
這部分工作是有客戶端的TLS來完成的。
首先會驗證公鑰是否有效,比如頒發(fā)機構,過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。
如果證書沒有問題,那么就生成一個隨即值。然后用證書對該隨機值進行加密。傳送加密信息
這部分傳送的是用證書加密后的隨機值,目的就是讓服務端得到這個隨機值,以后客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。服務段解密信息
服務端用私鑰解密后,得到了客戶端傳過來的隨機值(私鑰),然后把內容通過該值進行對稱加密。
所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠復雜,數(shù)據(jù)就夠安全。傳輸加密后的信息
這部分信息是服務段用私鑰加密后的信息,可以在客戶端被還原客戶端解密信息
客戶端用之前生成的私鑰解密服務段傳過來的信息,于是獲取了解密后的內容。整個過程第三方即使監(jiān)聽到了數(shù)據(jù),也束手無策