Android HTTP和HTTPS那點事
先看看網路OSI(Open System Interconnect)模型:
CA證書是什麼?
CA(Certificate Authority)是負責管理和簽發證書的第三方權威機構,是所有行業和公眾都信任的、認可的。
CA證書,就是CA頒發的證書,可用於驗證網站是否可信(針對HTTPS)、驗證某檔案是否可信(是否被篡改)等,也可以用一個證書來證明另一個證書是真實可信,最頂級的證書稱為根證書。除了根證書(自己證明自己是可靠),其它證書都要依靠上一級的證書,來證明自己。
HTTP三次握手
HTTP(HyperText Transfer Protocol)超文字傳輸協議是網際網路上應用最為廣泛的一種網路協議。由於資訊是明文傳輸,所以被認為是不安全的。而關於HTTP的三次握手,其實就是使用三次TCP握手確認建立一個HTTP連線。
如下圖所示,SYN(synchronous)是TCP/IP建立連線時使用的握手訊號、Sequence number(序列號)、Acknowledge number(確認號碼),三個箭頭指向就代表三次握手,完成三次握手,客戶端與伺服器開始傳送資料。
HTTPS原理
HTTPS(Hyper Text Transfer Protocol Secure),是一種基於SSL/TLS的HTTP,所有的HTTP資料都是在SSL/TLS協議封裝之上進行傳輸的。HTTPS協議是在HTTP協議的基礎上,添加了SSL/TLS握手以及資料加密傳輸,也屬於應用層協議。所以,研究HTTPS協議原理,最終其實就是研究SSL/TLS協議。
SSL/TLS協議作用
不使用SSL/TLS的HTTP通訊,就是不加密的通訊,所有的資訊明文傳播,帶來了三大風險:
竊聽風險:第三方可以獲知通訊內容。
篡改風險:第三方可以修改通知內容。
冒充風險:第三方可以冒充他人身份參與通訊。
SSL/TLS協議是為了解決這三大風險而設計的,希望達到:
所有資訊都是加密傳輸,第三方無法竊聽。
具有校驗機制,一旦被篡改,通訊雙方都會立刻發現。
配備身份證書,防止身份被冒充。
基本的執行過程
SSL/TLS協議的基本思路是採用公鑰加密法,也就是說,客戶端先向伺服器端索要公鑰,然後用公鑰加密資訊,伺服器收到密文後,用自己的私鑰解密,這就是非對稱加密。但是這裡需要了解兩個問題的解決方案。
- 如何保證公鑰不被篡改?
解決方法:將公鑰放在數字證書中。只要證書是可信的,公鑰就是可信的。
- 公鑰加密計算量太大,如何減少耗用的時間?
解決方法:每一次對話(session),客戶端和伺服器端都生成一個“對話金鑰”(session key),用它來加密資訊。由於“對話金鑰”是對稱加密,所以運算速度非常快,而伺服器公鑰只用於加密“對話金鑰”本身,這樣就減少了加密運算的消耗時間。
因此,SSL/TLS協議的基本過程是這樣的:
客戶端向伺服器端索要並驗證公鑰。
雙方協商生成“對話金鑰”。
雙方採用“對話金鑰”進行加密通訊。
上面過程的前兩布,又稱為“握手階段”。
客戶端發起HTTPS請求
服務端的配置
採用HTTPS協議的伺服器必須要有一套數字證書,可以是自己製作或者CA證書。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用CA證書則不會彈出提示頁面。這套證書其實就是一對公鑰和私鑰。公鑰給別人加密使用,私鑰給自己解密使用。傳送證書
這個證書其實就是公鑰,只是包含了很多資訊,如證書的頒發機構,過期時間等。客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值,然後用證書對該隨機值進行加密。傳送加密資訊
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通訊就可以通過這個隨機值來進行加密解密了。服務段解密資訊
服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將資訊和私鑰通過某種演算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密演算法夠彪悍,私鑰夠複雜,資料就夠安全。傳輸加密後的資訊
這部分資訊是服務段用私鑰加密後的資訊,可以在客戶端被還原。客戶端解密資訊
客戶端用之前生成的私鑰解密服務段傳過來的資訊,於是獲取瞭解密後的內容。整個握手過程第三方即使監聽到了資料,也束手無策。
HTTPS和HTTP的區別
- https協議需要到ca申請證書或自制證書。
- http的資訊是明文傳輸,https則是具有安全性的ssl加密。
- http是直接與TCP進行資料傳輸,而https是經過一層SSL(OSI表示層),用的埠也不一樣,前者是80(需要國內備案),後者是443。
- http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
附錄
HTTPS一般使用的加密與HASH演算法如下:
非對稱加密演算法:RSA,DSA/DSS
對稱加密演算法:AES,RC4,3DES
HASH演算法:MD5,SHA1,SHA256
完
更多精彩Android技術可以關注我們的微信公眾號,掃一掃下方的二維碼或搜尋關注公眾號:
Android老鳥