SSL pinning

一般的瀏覽器與手機會信任被機構簽發的證書,因為預設手機就存了一百多個, 所以 root certificate,許多家發的都會信任。 所以如果有個 proxy server 做 MITM 就很容易讀取封包。而 SSL pinning 將證書或公鑰 hash 後寫在應用程式,當server 要把公鑰傳給 app 端時會因為該公鑰無法產生跟一開始寫在 app 時的 hash 相同,於是拒絕連線。

步驟:

首先要先知道中間人攻擊原理(man in middle attack),wireshark, proxyman 在進行 https 封包破解時都會用到此方法:

1.某網站有用於非對稱加密的公鑰A、私鑰A。
2.瀏覽器向網站服務器請求,服務器把公鑰A明文給傳輸瀏覽器。
3.中間人劫持到公鑰A,保存下來,把數據包中的公鑰A替換成自己偽造的公鑰B(中間人當然也擁有公鑰B對應的私鑰B)
4.瀏覽器生成一個用於對稱加密的密鑰X,用公鑰B(瀏覽器無法得知公鑰被替換了)加密後傳給服務器。
5.中間人劫持後用私鑰B解密得到密鑰X,再用公鑰A加密後傳給服務器。
6.服務器拿到後用私鑰A解密得到密鑰X。

中間人想要替換成自己的公鑰的原因是,只有特定私鑰才能解密公鑰,中間人因為沒有原始server 的私鑰,所以利用替換自己的公鑰的方式。

此時如果有進行 SSL pinning 的話

SSL pinning: 將服務器的公鑰進行 sha256 雜湊與 base64 encoding 後產生的固定字串寫在應用程式端(app)。

此時中間人在上面第三部發送公鑰時因為中間人的公鑰進行 sha256 雜湊與 base64 encoding 後的字串與寫在應用程式端的不同,此時應用程式隨即會拒絕連線,解決了中間人攻擊。

其他資料

https://zhuanlan.zhihu.com/p/43789231

Last updated