HTTPS那些事兒(一)-HTTPS原理

HTTPS那些事兒(一)

最近看了《http權威指南》的幾個章節,對HTTPS有了部分了解,同時在網上查閱了一些資料,遂打算記錄一下心得,寫的倉促,肯定有很多錯誤的地方,歡迎大家指正。


1.HTTP是什麼

那麼在介紹https之前,有必要先解釋下http。http是一個非常簡單又非常複雜的協議,說其簡單,是我們每天都在用它,而且又渾然不覺,貌似很簡單的樣子。但是真正能夠把http完全瞭解清楚,並不是很容易的事情。《http權威指南》諾厚的一本書,都是http相關內容,可知有多麼複雜了。

  • 簡單來說,HTTP協議是超文本傳輸協議,是一種可靠的數據傳輸協議。像我們每天都在使用的web瀏覽器就是一種http客戶端,提供內容的web服務器就是服務器端。http客戶端和服務器端構成了萬維網的基本組件。web服務器是web資源的宿主,web資源是web內容的源頭,最簡單的web資源就是web服務器文件系統中的靜態文件,如文本文件,html文件,圖片,word文件以及mp3,avi等影音文件等;除了靜態文件,web資源還可能是根據需要生產內容的軟件程序,這些可以看做是動態文件。
  • 一個簡單的http請求是從我們打開瀏覽器,輸入url地址訪問指定網站開始的。一條請求命令和一個響應結果構成了一個HTTP事務。而幾乎世界上所有的HTTP通信都是由TCP/IP協議承載的,這就是我們熟悉的網絡ISO七層結構和TCP/IP4層結構,在大部分的情況我們只討論TCP/IP分層結構。那麼具體的訪問過程是怎麼樣的呢?比如我們訪問http://movie.douban.com/subject/10485647/?from=showing 這個鏈接地址,那麼具體包括如下幾個過程:
    • 1.瀏覽器解析初主機名。(主機名是movie.douban.com)
    • 2.瀏覽器查詢DNS服務器查到該主機名對應的ip地址。比如211.147.4.32。如果之前有訪問過該站點,則由於DNS記錄會被操作系統緩存,就不需要再次解析。此外,如果訪問的web服務器使用了DNS輪轉的話,則可能不同的時候查到的ip地址是不同的。
    • 3.瀏覽器獲得端口號。這裏默認是80.
    • 4.瀏覽器發起到211.147.4.32端口80的連接。
    • 5.瀏覽器向服務器發起一條HTTP GET的報文。
    • 6.瀏覽器從服務器讀取一條HTTP響應報文。
    • 7.瀏覽器關閉連接。
  • 更加詳細的過程可以參加《HTTP權威指南》,裏面有講到爲了提高性能的併發連接、持久連接以及連接管道化等。此外,這裏還有篇文章詳細介紹了一個HTTP事務的過程,請參見從輸入URL到頁面加載完成發生了什麼事情

2.從HTTP到HTTPS

基本的HTTP在web事務中是不夠安全的,這也就催生了HTTPS的誕生。HTTPS是在HTTP和TCP之間加了一層傳輸層的密碼安全層-SSL或者後來普遍使用的TLS。HTTPS協議會對web通信過程中的數據加密,杜絕了數據被竊取,總體來說還是很安全的。雖然前不久openssl爆出了一個heartbleed漏洞,不過現在已經修復了。HTTPS在URL中的前綴是HTTPS,默認端口是443,HTTP默認端口80。

2.1基本過程

    由於SSL安全層的存在,HTTPS建立安全傳輸的過程會略微複雜一些。HTTP客戶端(最常用的就是瀏覽器了)打開一條到web服務器端口443的連接。一旦建立了TCP連接,客戶端和服務器端就會初始化SSL層,對加密參數進行溝通並交換密鑰。握手完成後,SSL也就初始化完成了,客戶端就可以把請求報文發送給安全層了。當然,這些報文發送給TCP之前,會被加密。

2.2 SSL握手

  • SSL握手是最爲複雜的一步了,具體過程如下:
  • 1.客戶端(通常就是web瀏覽器)向服務器發送自己支持的加密規則並請求證書。
  • 2.服務器選擇一組加密算法和HASH算法,以及服務器證書發送給瀏覽器。(SSL支持雙向認證,web服務器將服務器證書發送給客戶端,然後再將客戶端的證書回送給服務器。但是實際應用中很多用戶都沒有自己的客戶端證書,因此服務器也很少會要求客戶端證書)
  • 3.瀏覽器獲取服務器證書之後需要驗證證書的合法性。具體有以下幾個步驟: 服務器證書一般包括如下信息:證書序列號,證書過期時間,站點組織名,站點DNS主機名,站點的公開密鑰,證書頒發者名稱,證書頒發者的簽名。網景公司提出了一種web服務器證書有效性算法是大部分瀏覽器有效驗證服務器證書的基礎。主要驗證步驟如下:
    • 3.1 日期檢測。
      檢查證書的起始時間和結束時間,以確保證書仍然有效。如果證書過期了或者還沒有被激活,則證書有效性驗證失敗,瀏覽器提示錯誤信息。
    • 3.2 證書頒發者可信度檢測。
      每個證書都是由某些證書頒發機構(CA)簽發的,它們負責爲服務器擔保。證書有不同等級,每種證書都需要不同級別的背景驗證。任何人都可以生成證書,但是有些CA是非常著名的組織,它們可以通過非常清晰的流程來驗證證書申請人的身份以及商業行爲的合法性。因此,瀏覽器通常會附帶一個簽名頒發機構的受信列表。如果是未知機構頒發的證書,則瀏覽器會顯示警告信息。
    • 3.3 簽名檢測。 一旦判定證書頒發者可信,瀏覽器就需要使用證書頒發者的公鑰對信息進行簽名,並將其與證書中的簽名進行比對,如果兩者不同,則信息可能被修改過,不能通過驗證。
    • 3.4 站點身份認證
      爲防止服務器複製其他人的證書,或攔截其他人的流量,大部分瀏覽器都會試着去驗證證書中包含的DNS主機名是否與正在對話的主機名是否匹配。如果不匹配,則要麼是瀏覽器警告用戶,要麼就是直接終止連接。對於虛擬主機(一臺服務器有多個主機名)站點上的安全流量處理是比較棘手的,有些流行的web服務器程序只支持一個證書,如果用戶請求虛擬主機名,則與證書中的主機名不匹配,這樣瀏覽器會發出警告。一個處理辦法是在開始安全事務前,將虛擬主機域名重定向至服務器證書中的官方主機名。(服務器證書中通常只包含一個主機名,但有些CA會爲一組服務器創建一些包含了服務器名稱列表或者通配域名的證書)
  • 4.如果服務器證書驗證通過,則瀏覽器會生成一串隨機的數字作爲密碼(實際用作密碼的隨機字符串生成過程比較複雜,這裏簡化了其過程。具體可以參加HTTPS那些事兒(二)),並用服務器證書中的公鑰進行加密。 此外,瀏覽器使用第2步中商量好的HASH算法對握手消息進行加密,採用的密碼就是剛剛生成的那串隨機數字。最後將這些信息(用公鑰加密的隨機數密碼,握手消息,採用HASH算法、隨機數密碼加密的握手消息簽名)發送給服務器。
  • 5.服務器接收瀏覽器信息,需要進行如下處理:
    • 5.1 用私鑰解密獲取隨機數密碼。
    • 5.2 用HASH算法根據該隨機數密碼對握手消息進行簽名,比對瀏覽器發來的簽名和該計算得到的簽名是否一致。
    • 5.3 如果簽名驗證通過,則使用該隨機數密碼加密一段握手消息,發送給瀏覽器。
  • 6.瀏覽器接收握手消息並使用隨機數密碼以及之前的HASH算法計算握手消息的HASH值。如果與發來的HASH值一致,此時握手結束,後續的消息都會通過隨機數密碼來進行加密和解密,使用的加密方法是對稱加密。要注意之前的公鑰加密和私鑰解密使用的是非對稱加密算法。

3.HTTPS中用到的算法

HTTPS一般使用的加密與HASH算法如下:   

非對稱加密算法:RSA,DSA/DSS

對稱加密算法:AES,RC4,3DES

HASH算法:MD5,SHA1,SHA256

非對稱加密算法用於之前在傳遞隨機數密碼的時候用到。對稱加密算法是安全連接建立後用到,用於加快加密解密的速度。HASH算法是用於驗證SSL握手過程數據完整性。SSL握手過程中如果有任何錯誤,都會使連接斷開,從而阻止了隱私信息的傳輸。由於HTTPS非常安全,攻擊者很難找到下手的地方,於是更多的是採用了假證書的手法來欺騙客戶端,這些假證書的識別方法在第2節中已經有說明。


4.參考資料

發佈了121 篇原創文章 · 獲贊 133 · 訪問量 68萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章