有關ssl-pinning的總結

發現問題

在使用charles對FaceBook/Twitter進行抓包時,所有的請求最終都失敗了。第一感覺是手機上安裝的HTTPS證書被刪除了,到設置中檢查發現證書沒有問題,手機上其它APP的https請求也能夠正常抓取。看來應該是碰到新情況了,Google了下,了解到FaceBook/Twitter等應用使用了一種名叫ssl-pinning的技術來防止中間人攻擊。

HTTPS

http與https

這張圖比較形象地道出了HTTPS實際上是由HTTP協議與TLS協議組合而成的一個協議。
TLS協議作用于HTTPS建立前客戶端與服務端通信建立信任的過程,其過程與TCP協議中的三次握手過程較為相似,有些同學可能會將二者混為一談,注意二者本質上是完全不同的。
HTTP協議作用于客戶端與服務端的正式通信過程,但二者通信的數據是被TLS協議最終生成的密鑰加密過。


HTTPS建立的完整過程

客戶端與服務端經過通信交換獲得了三個隨機數,通過這三個隨機數,客戶端與服務端能夠使用相同的算法生成后續HTTP通信過程中對稱加密算法使用的密鑰。也就是說HTTPS協議中非對稱加密只是在協議建立時使用,協議建立后使用的是對稱加密。

中間人攻擊

市面上的各種抓包軟件的實現原理就是中間人攻擊。TLS建立時客戶端生成的隨機數1、服務端生成的隨機數2都是明文的,只有隨機數據3使用非對稱加密技術加密。中間人攻擊的關鍵就是截獲服務器返回的證書并偽造證書發送給客戶端騙取信任,獲取隨機數3,進而達成盜取信息的目的。

那么客戶端為什么這么容易被騙呢?客戶端主要通過下面三種方式來校驗證書的合法性:

  • 查看證書是否過期
  • 服務器證書上的域名是否和服務器的實際域名相匹配
  • 校驗證書鏈

市面上大量的應用在證書檢驗方面做的都不夠,還有很多的應用完全末做驗證。而即使是完整的校驗了整個證書鏈體系,中間人攻擊同樣還是可以通過在終端上手動添加信任根證書的方式發動。這也正是Charles/Fiddler等抓包軟件在抓取HTTPS協議數據前,要求在終端上安裝證書的原因。這個證書可以確保偽造的證書通過客戶端的證書鏈校驗。


中間人攻擊

ssl-pinning

那么開篇提到的FaceBook/Twitter是如何做到防止Charles/Fiddler等抓包工具中間人攻擊的呢?原來它是在開發時就將服務端證書一塊打包到客戶端里。這樣在HTTPS建立時與服務端返回的證書比對一致性,進而識別出中間人攻擊后直接在客戶端側中止連接。
ssl-pinning技術在AFNetworking中已經得到支持,參照這篇文章

突破ssl-pinning

有矛就有盾,開發者已經突破了ssl-pinning的限制達成了Facebook/Twitter的抓包需求。其實現的基本原理很簡單,客戶端不是會做兩個證書間的一次性校驗嗎,那么就通過hook的方式將此次校驗的結果返回true或者干脆不讓其做校驗。當然這種做法只能在越獄環境下實現,但對于抓包來說,這已經足夠了。該方案已開源,其實現的基本原理在這篇文章中.

總結

沒有破解不了的應用,只有破解成本高到無法承受的應用,愿這個世界更美好。。。。。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容