萬盛學電腦網

 萬盛學電腦網 >> 系統工具 >> HTTPS連接的前幾毫秒發生了什麼

HTTPS連接的前幾毫秒發生了什麼

   花了數小時閱讀了如潮的好評,Bob最終迫不及待為他購買的托斯卡納全脂牛奶點擊了“進行結算”,然後……

  哇!剛剛發生了什麼?

  在點擊按鈕過後的220毫秒時間內,發生了一系列有趣的事情,火狐浏覽器(Firefox)不僅改變了地址欄顏色,而且在浏覽器的右下角出現了一個小鎖頭的標志。在我最喜歡的互聯網工具Wireshark的幫助下,我們可以通過一個經過略微調整的用於debug的火狐浏覽器來探究這一過程。

  根據RFC 2818標准(譯者注:RFC 2818為HTTP Over TLS-網絡協議),火狐浏覽器自動通過連接Amazon.com的443端口來響應HTTPS請求。

HTTPS連接的前幾毫秒發生了什麼 三聯

  很多人會把HTTPS和網景公司(Netscape)於上世紀九十年代中期創建的SSL(安全套接層)聯系起來。事實上,隨著時間的推移,這兩者之間的關系也慢慢淡化。隨著網景公司漸漸的失去市場份額,SSL的維護工作移交給了Internet工程任務組(IETF)。由網景公司發布的第一個版本被重新命名為TLS 1.0(安全傳輸層協議 1.0),並於1999年1月正式發布。考慮到TLS已經發布了將近10年,如今已經很難再見到真正的SSL通信了。

  客戶端問候(Client Hello)

  TLS將全部的通信以不同方式包裹為“記錄”(Records)。我們可以看到,從浏覽器發出的第一個字節為0×16(十進制的22),它表示了這是一個“握手”記錄。

  接下來的兩個字節是0×0301,它表示了這是一條版本為3.1的記錄,同時也向我們表明了TLS1.0實際上是基於SSL3.1構建而來的。

  整個握手記錄被拆分為數條信息,其中第一條就是我們的客戶端問候(Client Hello),即0×01。在客戶端問候中,有幾個需要著重注意的地方:

  隨機數:

  在客戶端問候中,有四個字節以Unix時間格式記錄了客戶端的協調世界時間(UTC)。協調世界時間是從1970年1月1日開始到當前時刻所經歷的秒數。在這個例子中,0x4a2f07ca就是協調世界時間。在他後面有28字節的隨機數,在後面的過程中我們會用到這個隨機數。

  SID(Session ID):

  在這裡,SID是一個空值(Null)。如果我們在幾秒鐘之前就登陸過了Amazon.com,我們有可能會恢復之前的會話,從而避免一個完整的握手過程。

  密文族(Cipher Suites):

  密文族是浏覽器所支持的加密算法的清單。整個密文族是由推薦的加密算法“TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA”和33種其他加密算法所組成。別擔心其他的加密算法會出現問題,我們一會兒就會發現Amazon也沒有使用推薦的加密算法。

  Server_name擴展:

  通過這種方式,我們能夠告訴Amazon.com:浏覽器正在試圖訪問https://www.amazon.com。這確實方便了很多,因為我們的TLS握手時間發生在HTTP通信之前,而HTTP請求會包含一個“Host頭”,從而使那些為了節約成本而將數百個網站域名解析到一個IP地址上的網絡托管商能夠分辨出一個網絡請求對應的是哪個網站。傳統意義上的SSL同樣要求一個網站請求對應一個IP地址,但是Server_name擴展則允許服務器對浏覽器的請求授予相對應的證書。如果沒有其他的請求,Server_name擴展應該允許浏覽器訪問這個IPV4地址一周左右的時間。

  服務器問候(Server Hello)

  Amazon.com回復的握手記錄由兩個比較大的包組成(2551字節)。記錄中包含了0×0301的版本信息,意味著Amazon同意我們使用TLS1.0訪問的請求。這條記錄包含了三條有趣的子信息:

  1.服務器問候信息(Server Hello)(2):

  我們得到了服務器的以Unix時間格式記錄的UTC和28字節的隨機數。

  32字節的SID,在我們想要重新連接到Amazon.com的時候可以避免一整套握手過程。

  在我們所提供的34個加密族中,Amazon挑選了“TLS_RSA_WITH_RC4_128_MD5”(0×0004)。這就意味著Amazon會使用RSA公鑰加密算法來區分證書簽名和交換密鑰,通過RC4加密算法來加密數據,利用Md5來校驗信息。我們之後會深入的研究這一部分內容。我個人認為,Amazon選擇這一密碼組是有其自身的原因的。在我們所提供的密碼族中,這一加密組的加密方式是CPU占用最低的,這就允許Amazon的每台服務器接受更多的連接。當然了,也許還有一個原因是,Amazon是在向這三種加密算法的發明者Ron Rivest(羅恩·李·維斯特)致敬。

  2.證書信息(11):

  這段巨大的信息共有2464字節,其證書允許客戶端在Amazon服務器上進行認證。這個證書其實並沒有什麼奇特之處,你能通過浏覽器浏覽它的大部分內容。

  3.服務器問候結束信息(14):

  這是一個零字節信息,用於告訴客戶端整個“問候”過程已經結束,並且表明服務器不會再向客戶端詢問證書。

  校驗證書

  此時,浏覽器已經知道是否應該信任Amazon.com。在這個例子中,浏覽器通過證書確認網站是否受信,它會檢查 Amazon.com 的證書,並且確認當前的時間是在“最早時間”2008年8月26日之後,在“最晚時間”2009年8月27日之前。浏覽器還會確認證書所攜帶的公共密鑰已被授權用於交換密鑰。

  為什麼我們要信任這個證書?

  證書中所包含的簽名是一串非常長的大端格式的數字:

  任何人都可以向我們發送這些字節,但我們為什麼要信任這個簽名?為了解釋這個問題,我們首先要回顧一些重要的數學知識:

  RSA加密算法的基礎介紹

  人人常常會問,編程和數學之間有什麼聯系?證書就為數學在編程領域的應用提供了一個實際的例子。Amazon的服務器告訴我們需要使用RSA算法來校驗證書簽名。什麼又是RSA算法呢?RSA算法是由麻省理工(MIT)的Ron Rivest、Adi Shamirh和Len Adleman(RSA命名各取了三人名字中的首字母)三人於上世紀70年代創建的。三位天才的學者結合了2000多年數學史上的精華,發明了這種簡潔高效的算法:

  選取兩個較大的初值p和q,相乘得n;n = p*q 接下來選取一個較小的數作為加密指數e,d作為解密指數是e的倒數。在加密的過程中,n和e是公開信息,解密密鑰d則是最高機密。至於p和q,你可以將他們公開,也可以作為機密保管。但是一定要記住,e和d是互為倒數的兩個數。

  假設你現在有一段信息M(轉換成數字),將其加密只需要進行運算:C ≡ Me (mod n)

  這個公式表示M的e次冪,mod n表示除以n取余數。當這段密文的接受者知道解密指數d的時候就可以將密文進行還原:Cd ≡ (Me)d ≡ Me*d ≡ M1 ≡ M (mod n)

  有趣的是,解密指數d的持有者還可以將信息M進行用解密指數d進行加密:Md ≡ S (mod n)

  加密者將S、M、e、n公開之後,任何人都可以獲得這段信息的原文:Se ≡ (Md)e ≡ Md*e ≡ Me*d ≡ M1 ≡ M (mod n)

  如同RSA的公共密鑰加密算法經常被稱之為非對稱算法,因為加密密鑰(在我們的例子中為e)和解密密鑰(在我們的例子中是d)並不對稱。取余運算的過程也不像我們平常接觸的運算(諸如對數運算)那樣簡單。RSA加密算法的神奇之處在於你可以非常快速的進行數據的加密運算,即 ,但是如果沒有解密密碼d,你將很難破解出密碼,即運算 將不可能實現。正如我們所看到的,通過對n進行因式分解而得到p和q,再推斷出解密密鑰d的過程難於上青天。

  簽名驗證

  在使用RSA加密算法的時候,最重要的一條就是要確保任何涉及到的數字都要足夠復雜才能保證不被現有的計算方法所破解。這些數字要多復雜呢?Amazon.com的服務器是利用“VeriSign Class 3 Secure Server CA”來對證書

copyright © 萬盛學電腦網 all rights reserved