1. 程式人生 > >Android開發應該知道的HTTPS相關知識

Android開發應該知道的HTTPS相關知識

前言

越來越多的網站和APP將請求協議從HTTP轉換到了HTTPS,那麼作為安卓程式設計師我們也有必要了解下HTTPS,不過本篇文章並不想講太多難懂的理論,更多的是講述HTTPS是如何實現資料加密並且身份驗證的,除此之外還有個額外補充是關於Charles這類截包軟體如何擷取HTTPS訊息的。

在開始之前如果你對對稱加密、非對稱加密、電子證書還、根證書、CA機構還不太瞭解的先看下下面的文章,這兩篇是我看過講的非常好的了,後面對這些概念不在細述。

[白話解釋 對稱加密演算法 VS 非對稱加密演算法]

[白話解釋 電子簽名,電子證書,根證書,HTTPS,PKI 到底是什麼]

概述

今天來聊聊我們工作中經常出現的HTTPS,首先丟擲一個問題,在之前的工作中我們一直用的HTTP協議進行網路請求完全ok呀,那麼我們為什麼要用HTTPS呢?

很顯然HTTP肯定有某些缺陷,這裡我列出來。

  1. 明文通訊,資訊會被竊聽
  2. 無法驗證通訊者身份
  3. 無法保證資訊未被篡改

那麼換成HTTPS就一定是為了解決這些問題。但其實呢HTTPS通訊和HTTP基本相同只不過在HTTP基礎上加了一個SSL(Secure Socket Layer)協議幫我們解決了上述三個問題。

從圖上可以發現HTTPS其實就是身披SSL協議這層外殼的HTTP,在採用 SSL後,HTTP 就擁有了 HTTPS 的加密、證書和完整性保護這些功能。

HTTPS流程分析

在我們準備和後臺進行HTTPS互動前首先有兩個準備工作

  1. 服務端去CA機構申請,然後CA會給後端一對公鑰、私鑰和公鑰證書,這個證書是CA通過他的私鑰將服務端公鑰、域名、公司名稱等資訊加密生成,最後後端將證書裝在伺服器上,當客戶端通過HTTPS請求的時候返回給客戶端。
  2. 客戶端(手機或者PC瀏覽器)上提前預裝了CA的公鑰,稱為根證書,可以用來解密服務端返回的證書拿到當中的資訊(最重要的兩個驗證域名和拿到公鑰)。

這裡我們可以看下CSDN的HTTPS證書

可以看到拖動條非常長包含了非常多的資訊,其中有兩個非常重要的域名和公鑰接下來我們會說到。

準備工作做完了接下來是流程的分析,看看HTTPS究竟如何做到資料加密、身份驗證。

  1. 客戶端先告訴服務端客戶端支援的SSL版本資訊等等。
  2. 服務端告訴客戶端使用的SSL版本、加密元件等資訊。
  3. 服務端將伺服器上的證書返回給客戶端。
  4. 告訴客戶端SSL初次握手協商部分結束。
  5. 然後客戶端根據預裝的根證書解密服務端傳來的證書,這個過程中有兩個非常重要的事要做1.確認你訪問的域名是證書中支援的域名(驗證身份)2.拿到證書當中的公鑰。由於非對稱加密比較消耗效能所以接下來會轉為對稱加密交換資料,但是對稱加密最大的問題就是金鑰傳輸過程不安全會被竊聽,所以用這個公鑰加密客戶端生成的對稱加密金鑰傳遞給服務端(加密)。
  6. 告知服務端在後面的通訊會採用第五步傳遞的金鑰對稱加密。
  7. 傳送finish報文,該報文包含連線至今全部報文的整體校驗值(有了校驗值保證資料不被篡改),並且是通過對稱加密後傳遞給服務端。
  8. 服務端傳送和第六步類似的修改加密說明的報文。
  9. 服務端傳送和第七步類似的finish報文。
  10. SSL通道建立成功後,後面的請求就都受SSL保護,接下來就是客戶端通過HTTP協議傳送請求。
  11. 服務端返回HTTP請求響應。

接下來說下HTTPS前面提到的加密、身份認證和完整性保護在這個流程中是如何體現的。

  • 加密:首先第三步傳遞給客戶端的證書,即使被別人截獲雖然能通過CA公鑰檢視裡面的內容但是無法修改,因為你沒有CA私鑰去重新生成證書,假如你修改後通過自己的私鑰生成一個偽證書給客戶端,但是客戶端並沒預裝對應的根證書無法解密所以證書是無法偽造的,其次在第五步傳遞對稱加密金鑰是通過服務端公鑰加密傳輸的即使被截獲也是在有限時間無法破解的,在後面SSL通道建立成功後,通過http傳輸的訊息也會在SSL層對稱加密後再傳輸。
  • 身份驗證:為了保證我們訪問的服務端就是真正的服務端,所以在第五步證書解密的時候會確認你訪問的域名是證書中支援的域名,比如上面CSDN證書中域名是*.csdn.net,那麼如果客戶端訪問的域名不在該泛域名之內就會提示錯誤。
  • 完整性:則是在請求的時候會把資料通過類似Hash演算法這種簽名演算法生成一個摘要然後通過加密生成一個數字簽名,將數字簽名和加密後的報文一起傳遞給服務端,服務端拿到資料後先解密,然後通過同樣的簽名演算法生成的摘要與請求體中的摘要比對,如果不一致則資料被篡改了。

最後總結下

其實這個過程中最關鍵的就是服務端把證書返回給客戶端,然後客戶端驗證身份、拿到公鑰,再將客戶端生成的對稱加密金鑰通過公鑰加密傳遞給服務端,服務端通過私鑰解析拿到對稱加密金鑰。後面的通訊就是走的HTTP協議,只不過是通過這個金鑰對稱加密的。

Charles擷取HTTPS報文

上面不是說道HTTPS是加密,那麼Charles是如何擷取HTTPS報文的呢?接下來我們就來分析。

首先Charles是支援SSL協議的,然後在截HTTPS報文之前,我們需要在手機上預裝一個Charles的根證書,並且信任他(這一步非常關鍵後面細說)

準備工作做完了接下來是流程分析。

流程用畫板畫的可能比較low(#.#)

上面HTTPS流程已經細講過了,這裡只講重點流程了

  1. 客戶端告知服務端SSL版本等資訊
  2. 服務端返回證書給客戶端
  3. 然後charles通過CA根證書解密證書,複製一份並修改公鑰,然後通過自己的私鑰加密生成一個偽證書傳遞給客戶端
  4. 客戶端從本地查詢可以用來解密的根證書,由於我們之前在手機上預裝了一個Charles根證書,所以可以解密傳遞過來的偽證書,拿到當中的charles公鑰
  5. 客戶端生成對稱加密金鑰,通過Charles公鑰加密傳輸
  6. Charles通過自己的私鑰解密拿到對稱加密金鑰,然後在通過服務端的公鑰加密傳遞給服務端

這第六步走完後Charles已經拿到了對稱加密金鑰,那麼後面對稱加密的通訊對於Charles來說也就等同於明文了,所以也就達到了HTTPS截包的目的。

現在再來看看我們一開始說的關鍵一步:在手機上預裝Charles的根證書,如果沒有那一步Charles生成的偽證書,客戶端就沒法解密,那麼整個流程也就走不通,所以知道為什麼關鍵了吧。