首先推薦一本書,《HTTP權威指南》我就是看這本書入門的,對http協議有了更好的理解,學習https的理論知識我認為需要了解以下幾點,需要一步步的深入學習:
1、HTTPS的基本概念?
2、HTTPS和HTTP的差別?HTTP + 數據加密技術 =HTTPS ?HTTPS 所謂的安全是指哪里安全?
3、HTTPS 的詳細交互過程?
4、基礎的密碼學知識學習:數字加密,對稱密鑰,非對稱密鑰,數字簽名,數字證書的基本概念。
5、使用openssl怎么制造自簽證書?
6、實現簡單的https的客戶端和服務器端(Python版本)
7、利用wireshake抓包進一步分析HTTPS協議
8、實際項目開發過程中遇到的問題總結
其中1-3個點,放在本筆記中,4放在同系列學習筆記二下;5放在同系列學習筆記三下;6放在同系列學習筆記四下;7放在同系列學習筆記五下
一、HTTPS的基本概念
HTTPS 是最流行的HTTP 安全形式。它是由網景公司首創的,所有主要的瀏覽器和服務器都支持此協議。HTTPS 的URL 以https://,而不是http:// 開頭,據此就可以分辨某個Web 頁面是通過HTTPS 而不是HTTP 訪問的。
HTTPS = HTTP + SSL(TLS),HTTPS 就是在安全的傳輸層上發送的HTTP。如下圖所示:HTTPS 沒有將未加密的HTTP 報文發送給TCP,它在將HTTP 報文發送給TCP 之前,先將其發送給了一個安全層,對其進行加密。現在,HTTP 安全層是通過SSL 及其現代替代協議TLS 來實現的。我們遵循常見的用法,用術語SSL 來表示SSL 或者TLS。

二、HTTPS與HTTP的區別
HTTP + 業務數據加密技術 ≠ HTTPS ;因為 HTTPS = HTTP + SSL(TLS),SSL ≠ 業務數據加密技術;SSL是安全層,建立SSL隧道需要做隧道認證,至少要完成單向認證(服務器認證)或者雙向認證,之后數據在傳輸的過程中都進行了加密處理;通常HTTP使用的在業務層做的數據字段的加密,是業務數據的加密,傳輸的過程中是沒有加密的;而HTTPS的加密是指傳輸層的加密。HTTPS跟HTTP相比,有以下幾個明顯的優點:
• 服務器認證(客戶端知道它們是在與真正的而不是偽造的服務器通話);
• 客戶端認證(服務器知道它們是在與真正的而不是偽造的客戶端通話),通常現在web服務,不需要做客戶端認證,只需要做服務器認證;
• 完整性(客戶端和服務器的數據不會被修改),因為整個傳輸過程是加密的;
• 加密(客戶端和服務器的對話是私密的,無需擔心被竊聽),使用wireshake監聽HTTPS端口會捕獲不到數據。
• 效率(一個運行的足夠快的算法,以便低端的客戶端和服務器使用),如果使用HTTP+特別復雜的數據加密技術來試圖替代HTTPS,交互的雙方在加解密的過程會消耗大量的性能,性能下降特別明顯。
• 普適性(基本上所有的客戶端和服務器都支持這些協議)。
• 管理的可擴展性(在任何地方的任何人都可以立即進行安全通信)。
• 適應性(能夠支持當前最知名的安全方法)。
• 在社會上的可行性(滿足社會的政治文化需要)。
三 、HTTPS的交互過程
1、歷程一:利用非對稱加密傳輸數據, HTTP + 非對稱加密技術
采用HTTP協議,利用非對稱加密RSA技術對數據進行加密(RSA 算法自身,甚至RSA 實現的源代碼,破解代碼找到相應的私有密鑰的難度仍相當于對一個極大的數進行質因數分解的困難程度,這種計算被認為是所有計算機科學中最難的問題之一)

只要服務器端保存好私鑰,這樣看來數據的傳輸鐵定是沒問題的,但是這還有一個很大的風險,如果黑客假冒自己是服務器端,把客戶端的公鑰替換成跟黑客服務器匹配的一對公鑰,客戶端會在不知情的情況下,與黑客服務器進行交互。
2、歷程二:簽名證書 + SSL 加密,驗證服務器身份,加密傳輸通道,所有的通信數據在應用層下加密傳輸,保證傳輸層安全。HTTPS

交互過程如上圖所示,詳細的描述了在簡歷TCP請求后,SSL握手的過程,整個HTTPS的交互過程大致如下:
第一步:1-3 服務器端生成一個證書請求,服務器向權威的CA機構申請證書,一般是把公鑰給CA進行加密生成帶CA簽名的證書。
第二步:4 如果CA是權威的機構,一般情況下瀏覽器會報錯CA的根證書,如果是自簽,則需要客戶端主動加載或者選擇信任服務器發來的證書。
第三步:5 建立底層socket服務,完成TCP的三次握手。
第四步:6 建立傳輸層的SSL握手,具體又可描述為:
A : 6.0-6.1 客戶端發起clent hello 請求:將自己支持的一套加密規則、以及一個隨機數(Random_C)發送給服務器。
B : 6.2-6.3 服務器響應server hello :服務器根據自己支持的加密規則,從客戶端發來的請求中選出一組加密算法與HASH算法,生成隨機數(Random_S),并將自己的身份信息以證書(CA)的形式發回給瀏覽器。
C: 6.4-6.5 客戶端接到服務器的初步響應后做四件事情,然后把數據發送給服務器端:
(1)證書校驗: 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等)。
(2)生成密碼:瀏覽器會生成一串隨機數的密碼(Pre_master),并用CA證書里的公鑰加密(enc_pre_master),用于傳給服務器。
(3)計算協商密鑰:
此時客戶端已經獲取全部的計算協商密鑰需要的信息:兩個明文隨機數 Random_C 和 Random_S 與自己計算產生的 Pre-master,計算得到協商密鑰enc_key。enc_key=Fuc(random_C, random_S, Pre-Master)
(4)生成握手信息:使用約定好的HASH計算握手消息,并使用協商密鑰enc_key及約定好的算法對消息進行加密。
D: 6.6-6.7 服務器端接收到客戶端發來的SSL握手信息后,做以下3件事:
(1)私鑰解密:使用自己的私鑰從接收到的enc_pre_master中解密取出密碼Pre_master。
(2)計算協商密鑰:此時服務器已經獲取全部的計算協商密鑰需要的信息:兩個明文隨機數 Random_C 和 Random_S 與Pre-master,計算得到協商密鑰enc_key。enc_key=Fuc(random_C, random_S, Pre-Master)
(3)解密握手消息:使用協商密鑰enc_key解密客戶端發來的握手消息,并驗證HASH是否與客戶端發來的一致。
(4)生成握手消息使用協商密鑰enc_key及約定好的算法加密一段握手消息,發送給客戶端。
第五步: 7 正常加密通信
握手成功之后,所有的通信數據在應用層下都將由之前協商密鑰enc_key及約定好的算法進行加密解密。
站長資訊網