1.基礎知識
http協議: 是網際網路上應用最為廣泛的網路協議,是客戶端和伺服器端請求和應答的標準,是一個從www(全球資訊網)伺服器傳輸超文字到本地瀏覽器的傳輸協議,能夠使得網路傳輸更加高效。
https協議: 是以安全為目標的http通道,簡單講就是http的安全版本。http透過與ssl加密協議結合實現更安全的傳輸(https)。
http宏觀通訊過程:1.客戶端向伺服器傳送請求報文。2.伺服器根據請求報文收集對應的組合成響應報文。3.客戶端收到響應報文後進行解析渲染。
https宏觀通訊過程:1 客戶端傳送請求到服務端2 服務端傳送數字證書3 客戶端解析並利用證書機構的公鑰從證書中取出服務端的公鑰4 客戶端生成隨機對稱金鑰(隨機數),並利用公鑰加密傳送給服務端5 服務端用私鑰解密取出對稱金鑰。6 雙方採用對稱加密的方式進行加密傳輸的http資料,收到後利用對稱金鑰解密這裡省卻了驗證異常的過程,正常的連線大致就是這樣。
2. http建立連線的過程:
Web 使用一種名為HTTP(HyperText Transfer Protocol,超文字傳輸協議)的協議作為規範,完成從客戶端到伺服器端等一系列運作流 程。而協議是對規則的約定。可以說,Web 是建立在HTTP 協議上通訊的。
· url請求· DNS解析· TCP連線· 傳送HTTP請求· 伺服器處理請求並返回HTTP報文· 解析渲染頁面· TCP連線結束
3. Socket小插曲
有人說我們C/S用的是 socket連線,也用到TCP,那麼HTTP和Socket有啥區別?
HTTP是短連線,Socket(基於TCP協議的)是長連線。儘管HTTP1.1開始支援久連線,但仍無法保證始終連線。而Socket連線一旦建立TCP三次握手,除非一方主動斷開,否則連線狀態一直保持。
HTTP連線服務端無法主動發訊息,Socket連線雙方請求的傳送先後限制。HTTP採用“請求-響應”機制,在客戶端還沒傳送訊息給服務端前,服務端無法推送訊息給客戶端。必須滿足客戶端傳送訊息在前,服務端回覆在後。Socket連線雙方類似peer2peer的關係,一方隨時可以向另一方喊話。
場景:
用HTTP的情況:雙方不需要時刻保持連線線上,比如客戶端資源的獲取、檔案上傳等。用Socket的情況:大部分即時通訊應用(QQ、微信)、聊天室、蘋果APNs等
4.https建立連線的過程:
4.1為什麼需要https?
http協議傳輸的資料是未加密的,是明文傳輸,所以使用http協議傳輸一些敏感資訊是不安全的,為了實現敏感資料的加密傳輸,網景公司設計了SSL(Secure Sockets Layer)協議,用於對http協議傳輸的資料進行加密,從此https協議就產生了。簡單來說,https協議是由ssl+http協議組合而成的加密資料傳輸協議,可用於敏感資料傳輸與網路身份驗證,比http協議更加安全。 https採用了非對稱加密+對稱加密結合的方式來工作(主要是ssl來做),因為非對稱加密速度慢,所以先利用非對稱加密來傳輸對稱加密的金鑰,然後再使用對稱加密的方式傳輸。在ssl建立了安全的通訊線路後就可以在這條線路上進行http通訊了。
4.2對稱加密和非對稱加密
對稱加密:雙方使用的同一個金鑰,既可以加密又可以解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 優點:速度快,對稱性加密通常在訊息傳送方需要加密大量資料時使用,演算法公開、計算量小、加密速度快、加密效率高。
缺點:在資料傳送前,傳送方和接收方必須商定好秘鑰,然後使雙方都能儲存好秘鑰。其次如果一方的秘鑰被洩露,那麼加密資訊也就不安全了。另外,每對使用者每次使用對稱加密演算法時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,金鑰管理成為雙方的負擔。 非對稱加密:一對金鑰由公鑰和私鑰組成(可以使用很多對金鑰)。私鑰解密公鑰加密的資料,公鑰解密私鑰加密的資料(私鑰公鑰可以互相加密解密)。 私鑰只能由一方保管,不能外洩。公鑰可以交給任何請求方。
4.3數字證書
非對稱加密無法證明公鑰本身沒有經過偽造,於是可以使用由數字證書認證機構等頒發的公鑰證書。
數字證書是一個經證書授權中心數字簽名的包含公鑰擁有者資訊以及公鑰的檔案。最簡單的證書包含一個公鑰、名稱以及證書授權中心的數字簽名。數字證書還有一個重要的特徵就是隻在特定的時間段內有效。
數字證書的生成是這樣的:服務端將自己的公鑰及相關資訊交給證書機構,機構使用其私鑰加密服務端的公鑰及相關資訊,而客戶端(瀏覽器)在安裝的時候就自帶了權威數字證書機構的公鑰,可以利用證書機構的公鑰從數字證書中提取出伺服器端的公鑰。
4.4詳細過程描述
步驟1:客戶端透過傳送 Client Hello 報文開始SSL通訊。報文中包含客戶端支援的SSL的指定版本、加密元件(Cipher Suite)列表(所使用的加密演算法及金鑰長度等)。 步驟2:伺服器可進行 SSL通訊時,會以Server Hello 報文作為應 答。和客戶端一樣,在報文中包含 SSL版本以及加密元件。伺服器的 加密元件內容是從接收到的客戶端加密元件內篩選出來的。 步驟3:之後伺服器傳送 Certificate 報文。報文中包含公開金鑰證書。 步驟4:最後伺服器傳送 Server Hello Done 報文通知客戶端,最初階 段的 SSL握手協商部分結束。 步驟5:SSL第一次握手結束之後,客戶端以 Client Key Exchange 報文作為迴應。報文中包含通訊加密中使用的一種被稱為 Pre-master secret 的隨機密碼串。該報文已用步驟 3 中的公開金鑰進行加密。 步驟6:接著客戶端繼續傳送 Change Cipher Spec 報文。該報文會提示伺服器,在此報文之後的通訊會採用 Pre-master secret 金鑰加密。 步驟7:客戶端傳送 Finished 報文。該報文包含連線至今全部報文的 整體校驗值。這次握手協商是否能夠成功,要以伺服器是否能夠正確 解密該報文作為判定標準。 步驟8:伺服器同樣傳送 Change Cipher Spec 報文。 步驟9:伺服器同樣傳送 Finished 報文。 步驟10:伺服器和客戶端的 Finished 報文交換完畢之後,SSL連線 就算建立完成。當然,通訊會受到SSL的保護。從此處開始進行應用層協議的通訊,即傳送 HTTP 請求。 步驟11:應用層協議通訊,即傳送 HTTP 響應。 步驟12:最後由客戶端斷開連線。斷開連線時,傳送close_notify 報文。上圖做了一些省略,這步之後再發送TCP和FIN報文來關閉與 TCP 的通訊