1. 程式人生 > >HTTPS那些事兒(一)-HTTPS原理

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.參考資料

  • 《HTTP權威指南》14章 安全HTTP