發表日期:2017-09 文章編輯:小燈 瀏覽次數:2721
前面兩篇文章中關于 HTTP 相關知識基本上介紹的差不多了,這篇文章是對 HTTP 協議的補充,主要介紹以下三點內容:
HTTP 的不足主要有以下幾點:
這些問題不僅在 HTTP 上出現,其他未加密的協議中也會存在這類問題。
由于 HTTP 本身不具備加密的功能,所以也無法做到對通信整體(使用 HTTP 協議通信的請求和響應的內容)進行加密。即,HTTP 報文使用明文(指未經加密的報文)方式發送。
因為按 TCP/IP 協議族的工作機制,通信內容在所有的通信線路上都有可能遭遇到窺視,所以說通信不加密是一個缺點。
即使已經過加密處理的通信,也會被窺視到通信內容,這點和未加密的通信是相同的。只是說如果通信經過加密,就有可能讓人無法破解報文信息的含義,但加密處理后的報文信息本身還是會被看到的。
竊聽相同段上的通信并非難事。只需要收集在互聯網上流動的數據包(幀)就行了。對于收集來的數據包的解析工作,可交給那些抓包或嗅探器工具。
通信的加密
一種方式是將通信加密。HTTP 協議中沒有加密機制,但可以通過和 SSL(Secure Socket Layer,安全套接層)或 TLS(Transport Layer Security,安全傳輸層協議)的組合使用,加密 HTTP 的通信內容。
用 SSL 建立安全通信線路之后,就可以在這條線路上進行 HTTP 通信了。與 SSL 組合使用的 HTTP 被稱為 HTTPS (HTTP Secure,超文本傳輸安全協議)或 HTTP over SSL。
誠然,為了做到有效的內容加密,前提是要求客戶端和服務器同時具備加密和解密機制。主要應用在 Web 服務中。有一點必須引起注意,由于該方式不同于 SSL 或 TLS 將整個通信線路加密處理,所以內容仍有被篡改的風險。
HTTP 協議中的請求和響應不會對通信方進行確認。也就是說存在"服務器是否就是發送請求中 URI 真正指定的主機,返回的響應是否真的返回到實際提出請求的客戶端"等類似問題。
任何人都可發起請求
在 HTTP 協議通信時,由于不存在確認通信方的處理步驟,任何人都可以發起請求。另外,服務器只要接收到請求,不管對方是誰都會返回一個響應(但也僅限于發送端的 IP 地址和端口號沒有被 Web 服務器設定限制訪問的前提下)。
HTTP 協議的實現本身非常簡單,不論是誰發送過來的請求都會返回響應,因此不確認通信方,會存在以下各種隱患:
查明對手的證書
雖然使用 HTTP 協議無法確定通信方,但如果使用 SSL 則可以。SSL 不僅提供加密處理,而且還使用一種被稱為證書的手段,可用于確定方。
證書由值得信任的第三方機構頒發,用以證明服務器和客戶端是實際存在的。
通過使用證書,以證明通信方就是意料中的服務器。這對使用者個人來講,也減少了個人信息泄露的危險性。另外,客戶端持有證書即可完成個人身份的確認,也可用于對 Web 網站的認證環節。
所謂完整性是指信息的準確度。若無法證明其完整性,通常也就意味著無法判斷信息是否準確。
像這樣,請求或響應在傳輸途中,遭攻擊者攔截并篡改內容的攻擊稱為中間人攻擊。
如何防止篡改
雖然有使用 HTTP 協議確認報文完整性的方法,但事實上并不便捷、可靠。其中常用的是 MD5 和 SHA-1 等散列值校驗的方法,以及用來確認文件的數字簽名方法。
提供文件下載服務的 Web 網站也會提供相應的以 PGP(Pretty Good Privacy,完美隱私)創建的數字簽名及 MD5 算法生成的散列值。PGP 是用來證明創建文件的數字簽名,MD5 是由單向函數生成的散列值。不論使用哪一種方法,都需要操縱客戶端的用戶本人親自檢查驗證下載的文件是否就是原來服務器上的文件。瀏覽器無法自動幫用戶檢查。
可惜的是,這些辦法也依然無法百分之百保證確認結果正確。因為 PGP 和 MD5 本身被改寫的話,用戶是沒有辦法意識到的。
為了有效防止這些弊端,有必要使用 HTTPS。SSL 提供認證和加密處理及摘要功能。僅靠 HTTP 確保完整性是非常困難的,因此通過和其他協議組合使用來實現這個目標。
如果在 HTTP 協議通信過程中使用未經加密的明文,比如在 Web 頁面中輸入信用卡號,如果這條通信線路遭到竊聽,那么信用卡號就暴露了。
另外,對于 HTTP 來說,服務器也好,客戶端也好,都是沒有辦法確認通信方的。因為很有可能并不是和原來預想的通信方在實際通信。并且還需要考慮到接收到的報文在通信途中已經遭到篡改這一可能性。
為了統一解決上述這些問題,需要在 HTTP 上再加入加密處理和認證等機制。我們把添加了加密及認證機制的 HTTP 稱為 HTTPS(HTTP Secure)。
HTTPS 并非是應用層的一種新協議。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和TLS(Transport Layer Security)協議代替而已。
通常,HTTP 直接和 TCP 通信。當使用 SSL 時,則演變成先和 SSL 通信,再由 SSL 和 TCP 通信了。簡言之,所謂 HTTPS,其實就是身披 SSL 外殼的 HTTP。
在采用 SSL 后,HTTP 就擁有了 HTTPS 的加密、證書和完整性保護這些功能。
SSL 是獨立于 HTTP 的協議,所以不光是 HTTP 協議,其他運行在應用層的 SMTP 和 Telnet 等協議均可配合 SSL 協議使用。可以說 SSL 是當今世界上應用最為廣泛的網絡安全技術。
SSL 采用一種叫做公開密鑰加密的加密處理方式。
近代的加密方法中的加密算法是公開的,而密鑰確實保密的。通過這種方式得以保持加密方法的安全性。
加密和解密都會用到密鑰。沒有密鑰就無法對密碼解密,反過來說,任何人只要持有密鑰就能解密了。如果密鑰被攻擊者獲得,那加密也就失去了意義。
以共享密鑰方式加密時必須將密鑰也給對方。可究竟怎樣才能安全的轉交?在互聯網上轉發密鑰時,如果通信被監聽那么密鑰就可會落入攻擊者之手,同時也就失去了加密的意義。另外還得設法安全地保管接收到的密鑰。
使用兩把密鑰的公開密鑰加密
公開密鑰加密方式很好地解決了共享密鑰加密的困難。
公開密鑰加密使用一對非對稱的密鑰。一把叫做私有密鑰,另一把叫做公開密鑰。私有密鑰不能讓其他任何人知道,而公有密鑰則可以隨意發布,任何人都可以獲得。
使用公開密鑰加密方式,發送密文的一方使用對方的公開密鑰進行加密處理,對方收到被加密的信息后,再使用自己的私有密鑰進行解密。利用這種方式,不需要發送用來解密的私有密鑰,也不必擔心密鑰被攻擊者竊聽而盜走。
另外,要想根據密文和公開密鑰,恢復到信息原文是異常困難的,因為解密過程就是在對離散對數進行求值,這并非輕而易舉就能辦到。
HTTPS 采用混合加密機制
HTTPS 采用共享密鑰加密和公開密鑰加密兩者并用的混合加密機制。若密鑰能夠實現安全交換,那么有可能會考慮僅使用公開密鑰加密來通信。但是公開密鑰加密和共享密鑰加密相比,其處理速度要慢。
所以應充分利用兩者各自的優勢,將多種方法組合起來用于通信。在交換密鑰環節使用公開密鑰加密方式,之后的建立通信交換報文階段則使用共享密鑰加密方式。
在公開密鑰加密方式中也存在一些問題,那就是無法證明公開密鑰本身就是貨真價實的公開密鑰。
為了解決上述問題,可以使用由數字證書認證機構(CA,Certificate Authority)和其他相關頒發的公開密鑰證書。
數字證書認證機構處于客戶端和服務器雙方都可信賴的第三方機構的立場上。數字證書認證機構的流程是:首先,服務器的運營人員向數字證書認證機構提供公開密鑰的申請。數字證書認證機構在判明提出申請者的身份之后,會對已申請的公開密鑰做數字簽名,然后分配這個已簽名的公開密鑰,并將該公開密鑰放入公鑰證書后綁定在一起。
服務器會將這份由數字證書認證機構頒發的公鑰證書發送給客戶端,以進行公開密鑰加密方式通信。公鑰證書也可叫做數字證書或直接稱為證書。
接到證書的客戶端可使用數字證書認證機構的公開密鑰,對那張證書上的數字簽名進行驗證,一旦驗證通過,客戶端便可明確兩件事:一,認證服務器的公開密鑰的是真實有效的數字證書認證機構。二,服務器的公開密鑰是值得信賴的。
可證明組織真實性的 EV SSL 證書
證書的一個作用是用來證明作為通信一方的服務器是否規范,另外一個作用是可確認對方服務器背后運營的企業是否真實存在。擁有該特性的證書是 EV SSL 證書。
EV SSL 證書是基于國際標準的認證指導方針頒發的證書。其嚴格規定了對運營組織是否真實的確認方針,因此,通過認證的 Web 網站能夠獲得更高的認可度。
用以確認客戶端的客戶端證書
HTTPS 中還可以使用客戶端證書。以客戶端證書進行客戶端認證,證明服務器正在通信的對方始終是預料之內的客戶端,其作用跟服務器證書如出一轍。
認證機構信譽第一
SSL 機制中介入認證機構之所以可行,是因為建立在其信用絕對可靠這一大前提下的。
由自認證機構頒發的證書稱為自簽名證書
如果使用 OpenSSL 這套開源程序,每個人都可以構建一套屬于自己的認證機構,從而給自己頒發服務器證書。但該服務器證書在互聯網上不可作為證書使用,似乎沒什么幫助的。
獨立機構的認證機構叫做自認證機構,由自認證機構頒發的“無用”證書也被戲稱為自簽名證書。
為了更好的理解 HTTPS,我們來觀察一下 HTTPS 的通信步驟。
在以上流程中,應用層發送數據時會附加一種叫做 MAC(Message Authentication Code)的報文摘要。MAC 能夠查知報文是否遭到篡改,從而保護報文的完整性。
下面是對整個流程的圖解。圖中說明了從僅適用服務器端的公開密鑰證書(服務器證書)建立 HTTPS 通信的整個過程。
SSL 的慢是分兩種。一種是指通信慢。另一種是指由于大量消耗 CPU 及內存等資源,導致處理速度變慢。
和使用 HTTP 相比,網絡負載可能會變慢 2 到 100 倍。除去和 TCP 連接、發送 HTTP 請求/響應外,還必須進行 SSL 通信,因此整體上處理通信量不可避免會增加。
另一點是 SSL 必須進行加密處理。在服務器和客戶端都需要進行加密和解密的運算處理。因此從結果上講,比起 HTTP 會更多地消耗服務器和客戶端的硬件資源,導致負載增強。
針對速度變慢這一問題,并沒有根本性的解決方案,我們會使用 SSL 加速器這種(專用服務器)硬件來改善該問題。該硬件為 SSL 通信專用硬件,相對軟件來講,能夠提高數倍 SSL 的計算速度。僅在 SSL 處理時發揮 SSL 加速器的功效,以分擔負載。
為什么不一直使用 HTTPS
1. 因為與純文本通信相比,加密通信會消耗更多的 CPU 及內存資源。如果每次通信都加密,會消耗相當多的資源,平攤到一臺計算機上時,能夠處理的請求數量也必然減少。
因此,如果是非敏感信息則使用 HTTP 通信,只有在包含個人信息等敏感數據時,才利用 HTTPS 加密通信。
2. 除此之外,想要節約購買證書的開銷也是原因之一。
計算機本身無法判斷坐在顯示器前的使用者的身份,為了確認是誰在訪問服務器,需要核對“登錄者本人才知道的信息”、“登錄者本人才會有的信息”。核對的信息通常是指以下這些:
HTTP 使用的認證方式
HTTP/1.1 使用的認證方式如下所示:
BASIC 認證(基本認證)是從 HTTP/1.0 就定義的認證方式。即便是現在仍有一部分的網站會使用這種認證方式。是 Web 服務器與通信客戶端之間進行的認證方式。
步驟1:當請求的資源需要 BASIC 認證時,服務器會隨狀態碼 401 Authorization Required,返回帶 WWW-Authenticate 首部字段的響應。該字段內包含認證的方式(BASIC)及 Request-URI 安全域字符串(realm)。
步驟2:接收到狀態碼 401 的客戶端為了通過 BASIC 認證,需要將用戶 ID 及密碼發送給服務器。發送的字符串內容是由用戶 ID 和密碼構成,兩者中間以冒號(:)連接后,再經過 Base64 編碼處理。將編碼后的字符串寫入首部字段 Authorization 后,發送請求。
步驟3:接收到包含首部字段 Authorization 請求的服務器,會對認證信息的正確性進行驗證。如驗證通過,則返回一條包含 Request-URI 資源的響應。
BASIC 認證雖然采用 Base64 編碼方式,但這不是加密處理。不需要任何附加信息即可對其解密。換言之,由于明文解碼后就是用戶 ID 和密碼,在 HTTP 等非加密通信的線路上進行 BASIC 認證的過程中,如果被人竊聽,被盜的可能性極高。
另外,除此之外想再進行一次 BASIC 認證時,一般的瀏覽器卻無法實現認證注銷操作,這也是問題之一。
BASIC 認證使用上不夠靈活,且達不到多數 Web 網站期望的安全性等級,因此它并不常用。
為彌補 BASIC 認證存在的弱點,從 HTTP/1.1 起就有了 DIGEST 認證。DIGEST 認證同樣使用質詢/響應的方式(challenge/response),但不會像 BASIC 認證那樣直接發送明文密碼。
所謂質詢響應方式是指,一開始一方會先發送認證要求給另一方,接著使用從另一方那接收到的咨詢碼計算生成響應碼。最后將響應碼返回給對方進行認證的方式。
因為發送給對方的只是響應摘要及由知訊碼產生的計算結果,所以比起 BASIC 認證,密碼泄露的可能性就降低了。
步驟1:請求需認證的資源時,服務器會隨著狀態碼 401 Authorication Required,返回帶WWW-Authenticate 首部字段的響應。該字段內包含質問響應方式認證所需要的臨時咨詢碼(隨機數,nonce)。
首部字段 WWW-Authenticate 內必須包含 realm 和 nonce 這兩個字段的信息。客戶端就是依靠向服務器回送這兩個值進行認證的。
nonce 是一種每次隨返回的 401 響應生成的任意隨機字符串。該字符串通常推薦由 Base64 編碼的十六進制數的組成形式,但實際內容依賴服務器的具體實現
步驟2:接收到401 狀態碼的客戶端,返回的響應中包含 DIGEST 認證必須的首部字段 Authorization 信息。首部字段 Authorization 內必須包含 username、realm、nonce、uri 和 response 的字段信息,其中,realm 和 nonce 就是之前從服務器接收到的響應中的字段。
步驟3:接收到包含首部字段 Authorization 請求的服務器,會確認認證信息的正確性。認證通過后則會返回包含 Request-URI 資源的響應。
并且這時會在首部字段 Authorization-Info 寫入一些認證成功的相關信息。
SSL 客戶端認證是借由 HTTPS 的客戶端證書完成認證的方式。憑借客戶端證書認證,服務器可確認訪問是否來自登錄的客戶端。
為達到 SSL 客戶端認證的目的,需要事先將客戶端證書分發給客戶端,且客戶端必須安裝此證書。
步驟1:接收到需要認證資源的請求,服務器會發送 Certificate Request 報文,要求客戶端提供客戶端證書。
步驟2:用戶選擇將發送的客戶端證書后,客戶端會把客戶端證書信息以 Client Certificate 報文方式發送給服務器。
步驟3:服務器驗證客戶端證書驗證通過后方可領取證書內客戶端的公開密鑰,然后開始 HTTPS 加密通信。
在多數情況下,SSL 客戶端認證不會僅依靠證書完成認證,一般會和基于表單認證組合形成一種雙因素認證來使用。所謂雙因素認證就是指,認證過程中不僅需要密碼這一個因素,還需要申請認證者提供其他持有信息,從而作為另一個因素,與其組合使用的認證方式。
換言之,第一個認證因素的 SSL 客戶端證書用來認證客戶端計算機,另一個認證因素的密碼則用來確定這是用戶本人的行為。
使用 SSL 客戶端認證需要用到客戶端證書,而客戶端證書需要支付一定費用才能使用。
基于表單的認證方法并不是在 HTTP 協議中定義的。客戶端會向服務器上的 Web 應用程序發送登錄信息,按登錄信息的驗證結果認證。
多數情況下,輸入已事先登錄的用戶 ID 和密碼等登錄信息后,發送給 Web 應用程序,基于認證結果來決定認證是否成功。
基于表單認證的標準規范尚未有定論,一般會使用 Cookie 來管理 Session(會話)。
基于表單認證本身是通過服務器端的 Web 應用,將客戶端發送過來的用戶 ID 和密碼與之前登錄過的信息做匹配來進行認證的。
但鑒于 HTTP 是無狀態協議,之前已認證成功的用戶狀態無法通過協議層面保存下來。即,無法實現狀態管理,因此即使該用戶下一次繼續訪問,也無法區分他與其他的用戶。于是我們會使用 Cookie 來管理 Session,以彌補 HTTP 協議中不存在的狀態管理功能。
步驟1:客戶端會把用戶 ID 和密碼等登錄信息放入報文的實體部分,通常是以 POST 方法把請求發送給服務器。而這時,會使用 HTTPS 通信來進行 HTML 表單畫面的顯示和用戶輸入數據的發送。
步驟2:服務器會發放用以識別用戶的 Session ID。通過驗證從客戶端發送過來的登錄信息進行身份認證,然后把用戶的認證狀態和 Session ID 綁定后記錄在服務器端。
向客戶端返回響應時,會在首部字段 Set-Cookie 內寫入 Session ID。另外,為減輕跨站腳本攻擊(XSS)造成的損失,建議事先在 Cookie 內加上 httponly 屬性。
步驟3:客戶端接收到從服務器端發來的 Session ID 后,會將其作為 Cookie 保存在本地。下次向服務器發送請求時,瀏覽器會自動發送 Cookie,所以 Session ID 也隨之發送到服務器。服務器端可通過驗證接收到的 Session ID 識別用戶和其認證狀態。
HTTP 功能上的不足可通過創建一套全新的協議來彌補。可是目前基于 HTTP 的 Web 瀏覽器的使用環境已遍布全球,因此無法完全拋棄 HTTP。有一些新協議的規則是基于 HTTP 的,并在此基礎上添加了新的功能。
Google 在 2010 年發布了 SPDY,其開發目標旨在解決 HTTP 的性能瓶頸,縮短 Web 頁面的加載時間(50%)。
HTTP 存在以下缺點和不足:
Ajax 是一種有效利用 JavaScript 和 DOM 的操作,以達到局部 Web 頁面替換加載的異步通信手段。和以前的同步通信相比,由于它只更新一部分頁面,響應中傳輸的數據量會因此而減少。
而利用 Ajax 實時地從服務器獲取內容,有可能會導致大量請求產生。
內容上雖然可以做到實時更新,但為了保留響應,一次連接的持續時間也變長了。期間,為了維持連接會消耗更多的資源。
SPDY 沒有完全改寫 HTTP 協議,而是在 TCP/IP 的應用層與運輸層之間通過新加會話層的形式運作。同時,考慮到安全性問題,SPDY 規定通信中使用 SSL。
SPDY 以會話層的形式加入,控制對數據的流動,但還是采用 HTTP 建立通信連接。因此,可照常使用 HTTP 的 GET 和 POST 等方法,Cookie 以及 HTTP 報文等。
使用 SPDY 后,HTTP 協議額外獲得以下功能。
因為 SPDY 基本上只是將多個域名(IP 地址)的通信多路復用,所以當一個 Web 網站上使用多個域名下的資源,改善效果就會收到限制。
WebSocket 是為解決 HTTP 協議所面臨的困難的一種新的協議及 API。
WebSocket,即 Web 瀏覽器與 Web 服務器之間全雙工通信標準。仍在開發中的 WebSocket 技術主要是為了解決 Ajax 和 Comet 里 XMLHttpRequest 附帶的缺陷所引起的問題。
一旦 Web 服務器與客戶端之間建立起 WebSocket 協議的通信連接,之后所有的通信都依靠這個專用協議進行。通信過程中可相互發送 JSON、XML、HTML 或圖片等任意格式的數據。
由于是建立在 HTTP 基礎上的協議,因此連接的發起方仍是客戶端,而一旦確立 WebSocket 通信連接,不論服務器還是客戶端,任意一方都可直接向對方發送報文。
下面我們列舉一下 WebSocket 協議的主要特點:
為了實現 WebSocket 通信,在 HTTP 連接建立之后,需要完成一次 “握手” 的步驟。
Upgrade
首部字段,告知服務器通信協議發送改變,已達到握手的目的。“GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13”
Sec-WebSocket-Protocol
字段內記錄著握手過程中必不可少的鍵值,Sec-WebSocket-Protocol
字段內記錄使用的子協議。
子協議按 WebSocket
協議標準在連接分開使用時,定義那些連接的名稱。
101 Switching Protocols
的響應。“HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat”
Sec-WebSocket-Accept
的字段值是由握手請求中的 Sec-WebSocket-Accept
的字段值生成的。
成功握手確立 WebSocket
連接之后,通信時不再使用 HTTP 的數據幀,而采用 WebSocket 獨立的數據幀。
HTTP/2.0 在 2014 年 11 月實現標準化。
HTTP/2.0 圍繞著主要的 7 項技術進行討論。
壓縮 | SPDY、Friendly |
---|---|
多路復用 | SPDY |
TLS 義務化 | Speed + Mobility |
協商 | Speed + Mobility |
客戶端拉拽 | Speed + Mobility |
流量控制 | SPDY |
WebSocket | Speed + Mobility |
日期:2018-04 瀏覽次數:6761
日期:2017-02 瀏覽次數:3435
日期:2017-09 瀏覽次數:3654
日期:2017-12 瀏覽次數:3526
日期:2018-12 瀏覽次數:4815
日期:2016-12 瀏覽次數:4582
日期:2017-07 瀏覽次數:13642
日期:2017-12 瀏覽次數:3505
日期:2018-06 瀏覽次數:4265
日期:2018-05 瀏覽次數:4442
日期:2017-12 瀏覽次數:3556
日期:2017-06 瀏覽次數:3979
日期:2018-01 瀏覽次數:3941
日期:2016-12 瀏覽次數:3908
日期:2018-08 瀏覽次數:4423
日期:2017-12 瀏覽次數:3705
日期:2016-09 瀏覽次數:6404
日期:2018-07 瀏覽次數:3205
日期:2016-12 瀏覽次數:3230
日期:2018-10 瀏覽次數:3377
日期:2018-10 瀏覽次數:3479
日期:2018-09 瀏覽次數:3577
日期:2018-02 瀏覽次數:3595
日期:2015-05 瀏覽次數:3518
日期:2018-09 瀏覽次數:3305
日期:2018-06 瀏覽次數:3433
日期:2017-02 瀏覽次數:3869
日期:2018-02 瀏覽次數:4334
日期:2018-02 瀏覽次數:4171
日期:2016-12 瀏覽次數:3571
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.