文章目錄
HTTPS協議
HTTP的缺點
- 通信使用明文(不加密),內容可能會被竊聽
- 不驗證通信方的身份,因此有可能遭遇僞裝
- 無法證明報文的完整性,所以有可能已遭篡改
解決方法
HTTP+通信加密+證書+完整性保護=HTTPS
證書:證書可證明服務器或客戶端的身份
SSL和TLS
安全套接層俗稱Secure Socket Layer(SSL)是由Netscape Communication於1990年開發,用於保障Word Wide Web(WWW)通訊的安全。主要任務是提供私密性,信息完整性和身份認證。1994年改版爲SSLv2,1995年改版爲SSLv3。
Transport Layer Security(TLS)標準協議由IETF於1999年頒佈,整體來說TLS非常類似與SSLv3,只是對SSLv3做了增加和修改。
SSL協議介紹
SSL是一個不依賴於平臺和運用程序的協議,用於保障TCP-based運用安全,SSL在TCP和運用層之間,就像運用層連接到TCP連接的一個插口。
SSL加密知名協議
- HTTP over SSL:加密網頁流量是設計SSL的初衷,HTTP也是第一個使用SSL保障安全的運用層協議。當Netscape在它的Navigator裏邊運用HTTP over SSL的時候,它使用**https://來標識HTTP over SSL,因此HTTP over SSL就以HTTPS的格式被我們熟知。後來HTTPS在RFC2818被標準化。HTTPS工作在TCP 443號端口,但是普通的HTTP默認工作在TCP 80 端口。
- Email over SSL: 類似於HTTP over SSL,郵件協議例如:SMTP、POP3和IMAP也能支持SSL。SMTP over TLS的標準化文檔在RFC2487,POP3和IMAP over TLS的標準化文檔在RFC2596。
SSL建立的兩大階段
第一階段:HandShake phase(握手階段)
A.協商加密算法
B.認證服務器
C.建立用於加密和MAC(Message Authentication Code)用的密鑰
(類似於IPSec VPN ISAKMP的作用)
第二階段:Secure data transfer phase(安全的數據傳輸階段)在已經建立的SSL連接裏安全的傳輸數據(類似於IPSec VPN ESP的作用)
SSL三大協議
- Record protocol
記錄協議是主要的封裝協議,它傳輸不同的高層協議和運用層數據。它從上層用戶協議獲取信息並且傳輸,執行需要的任務,例如:分片,壓縮,運用MAC和加密,並且傳輸最終數據。它也執行反向行爲,解密,確認,解壓縮和重組裝來獲取數據。記錄協議包括四個上層客戶協議,Hanshake(握手)協議,Alert(告警)協議,Change Cipher Spec(修改密鑰說明)協議,Application Data(運用層數據)協議 - Handshake protocols
握手協議負責建立和恢復SSL會話。用於建立SSL客戶和服務器之間的連接,這個過程由如下這幾個主要任務組成:1、Negotiate security capabilities(協商安全能力):處理協議版本和安全加密算法。2、Authentication(認證):客戶認證服務器,當然服務器也可以認證客戶。3、Key exchange(密鑰交換):雙方交換用於產生master keys(主密鑰)的密鑰或信息。4、Key derivation(密鑰引出):雙方引出master secret(主祕密),這個主祕密用於產生用於數據加密和MAC的密鑰。
它由三個子協議組成。
A.Handshake Protocol(握手協議)協商SSL會話的安全參數
B.Alert Protocol(告警協議)一個事務管理協議,用於在SSL對等體間傳遞告警信息。告警信息包括:
a.errors(錯誤)
b.exception condition(異常狀況) 例如:錯誤的MAC或者解密失敗
c.notification(通告) 例如:會話終止
C.Change Cipher Spec Protocol (修改密鑰說明) 協議,用於在後續記錄中通告密鑰策略轉換。 - Application Data Protocol
運用程序數據協議處理上層運用程序數據的傳輸。
HTTP認證
HTTP使用的認證方式
- BASIC認證(基本認證)
- DIGEST認證(摘要認證)
- SSL客戶端認證
- FormBase認證(基於表單認證)
此外,還有Windows統一認證(Keberos認證、NTLM認證)
BASIC認證
從HTTP/1.0就定義的認證方式。即便是現在仍有一部分的網站會使用這種認證方式。是Web服務器與通信客戶端之間進行的認證方式。
DIGEST認證
爲彌補BASIC認證存在的弱點,從HTTP/1.1起就有了DIGEST認證,DIGEST認證同樣使用質詢/響應的方式(challenge/response),但不會像BASIC認證那樣直接發送明文密碼。
所謂質詢響應方式是指,一開始一方會先發送認證要求給另一方,接着使用從另一方那接收到的質詢碼計算生成響應碼。最後將響應碼返回給對方進行認證的方式。
SSL客戶端認證
是藉由HTTPS的客戶端證書完成認證的方式。憑藉客戶端證書認證,服務器可確認訪問是否來自己登錄的客戶端。
基於表單認證(最主流的方式)
基於表單的認證方法並不是在HTTP協議中定義的。客戶端會向服務器上的Web應用程序發送登錄信息(Credential),按登錄信息的驗證結果認證。
根據Web應用程序的實際安裝,提供的用戶界面及認證方式也各不相同。
淘寶,京東的登陸等基本上是表單認證。
WEB認證主要採用表單認證
由於使用上的便利性及安全性問題,HTTP協議標準提供的BASIC認證和DIGEST認證幾乎不怎麼使用。另外,SSL客戶端認證雖然具有高度的安全等級,但因爲導入及維持費用等問題,還尚未普及。
比如SSH和FTP協議,服務器和客戶端之間的認證是符合標準規範的,並且滿足了最基本的功能需求上的安全使用級別,因此這些協議的認證可以拿來直接使用。但是對於Web網站的認證功能,能夠滿足其安全使用級別的標準規範並不存在,所以只好使用由Web應用程序各自實現基於表單的認證方式。
Session管理及Cookie應用
基於表單認證的標準規範尚未有定論,一般使用Cookie來管理Session(會話)。
基於表單認證本身是通過服務器端的Web應用,將客戶端發送過來的用戶ID和密碼與之前登錄過的信息做匹配來進行認證的。
但鑑於HTTP是無狀態協議,之前已認證成功的用戶狀態無法通過協議層保存下來。即,無法實現狀態管理,因此即使當該用戶下一次繼續訪問,也無法區分他與其他的用戶。於是我們會使用Cookie來管理Session,以彌補HTTP協議中不存在的狀態管理功能。
CGI
Common Gateway Interface,通用網關接口,是指Web服務器在接收到客戶端發過來的請求後轉發給程序的一組機制。在CGI的作用下,程序會對請求內容做出相應的動作,比如創建HTML等動態內容。
使用CGI的程序叫做CGI程序,通常是由Perl、PHP、Python、Ruby和C等編程語言編寫而成。