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生成的僞證書,客戶端就沒法解密,那麼整個流程也就走不通,所以知道爲什麼關鍵了吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章