在開始之前如果你對對稱加密、非對稱加密、電子證書還、根證書、ca機構還不太了解的先看下下面的文章,這兩篇是我看過講的非常好的了,後面對這些概念不在細述。
[白話解釋 對稱加密演算法 vs 非對稱加密演算法]
[白話解釋 電子簽名,電子證書,根證書,https,pki 到底是什麼]
今天來聊聊我們工作中經常出現的https,首先丟擲乙個問題,在之前的工作中我們一直用的http協議進行網路請求完全ok呀,那麼我們為什麼要用https呢?
很顯然http肯定有某些缺陷,這裡我列出來。
明文通訊,資訊會被竊聽
無法驗證通訊者身份
無法保證資訊未被篡改
那麼換成https就一定是為了解決這些問題。但其實呢https通訊和http基本相同只不過在http基礎上加了乙個ssl(secure socket layer)協議幫我們解決了上述三個問題。
從圖上可以發現https其實就是身披ssl協議這層外殼的http,在採用 ssl後,http 就擁有了 https 的加密、證書和完整性保護這些功能。
在我們準備和後台進行https互動前首先有兩個準備工作
服務端去ca機構申請,然後ca會給後端一對公鑰、私鑰和公鑰證書,這個證書是ca通過他的私鑰將服務端公鑰、網域名稱、公司名稱等資訊加密生成,最後後端將證書裝在伺服器上,當客戶端通過https請求的時候返回給客戶端。
客戶端(手機或者pc瀏覽器)上提前預裝了ca的公鑰,稱為根證書,可以用來解密服務端返回的證書拿到當中的資訊(最重要的兩個驗證網域名稱和拿到公鑰)。
這裡我們可以看下csdn的https證書
可以看到拖動條非常長包含了非常多的資訊,其中有兩個非常重要的網域名稱和公鑰接下來我們會說到。
準備工作做完了接下來是流程的分析,看看https究竟如何做到資料加密、身份驗證。
客戶端先告訴服務端客戶端支援的ssl版本資訊等等。
服務端告訴客戶端使用的ssl版本、加密元件等資訊。
服務端將伺服器上的證書返回給客戶端。告訴客戶端ssl初次握手協商部分結束。
然後客戶端根據預裝的根證書解密服務端傳來的證書,這個過程中有兩個非常重要的事要做1.確認你訪問的網域名稱是證書中支援的網域名稱(驗證身份)2.拿到證書當中的公鑰。由於非對稱加密比較消耗效能所以接下來會轉為對稱加密交換資料,但是對稱加密最大的問題就是金鑰傳輸過程不安全會被竊聽,所以用這個公鑰加密客戶端生成的對稱加密金鑰傳遞給服務端(加密)。告知服務端在後面的通訊會採用第五步傳遞的金鑰對稱加密。
傳送finish報文,該報文包含連線至今全部報文的整體校驗值(有了校驗值保證資料不被篡改),並且是通過對稱加密後傳遞給服務端。
服務端傳送和第六步類似的修改加密說明的報文。
服務端傳送和第七步類似的finish報文。
ssl通道建立成功後,後面的請求就都受ssl保護,接下來就是客戶端通過http協議傳送請求。
服務端返回http請求響應。
接下來說下https前面提到的加密、身份認證和完整性保護在這個流程中是如何體現的。
最後總結下
其實這個過程中最關鍵的就是服務端把證書返回給客戶端,然後客戶端驗證身份、拿到公鑰,再將客戶端生成的對稱加密金鑰通過公鑰加密傳遞給服務端,服務端通過私鑰解析拿到對稱加密金鑰。後面的通訊就是走的http協議,只不過是通過這個金鑰對稱加密的。
上面不是說道https是加密,那麼charles是如何擷取https報文的呢?接下來我們就來分析。
首先charles是支援ssl協議的,然後在截https報文之前,我們需要在手機上預裝乙個charles的根證書,並且信任他(這一步非常關鍵後面細說)
準備工作做完了接下來是流程分析。
流程用畫板畫的可能比較low(#.#)
上面https流程已經細講過了,這裡只講重點流程了
客戶端告知服務端ssl版本等資訊
服務端返回證書給客戶端
然後charles通過ca根證書解密證書,複製乙份並修改公鑰,然後通過自己的私鑰加密生成乙個偽證書傳遞給客戶端
客戶端從本地查詢可以用來解密的根證書,由於我們之前在手機上預裝了乙個charles根證書,所以可以解密傳遞過來的偽證書,拿到當中的charles公鑰
客戶端生成對稱加密金鑰,通過charles公鑰加密傳輸
charles通過自己的私鑰解密拿到對稱加密金鑰,然後在通過服務端的公鑰加密傳遞給服務端
這第六步走完後charles已經拿到了對稱加密金鑰,那麼後面對稱加密的通訊對於charles來說也就等同於明文了,所以也就達到了https截包的目的。
現在再來看看我們一開始說的關鍵一步:在手機上預裝charles的根證書,如果沒有那一步charles生成的偽證書,客戶端就沒法解密,那麼整個流程也就走不通,所以知道為什麼關鍵了吧。
android裝置你所應該知道的Android設計
時光緊張,先記一筆,後續優化與完善。當然很多系統的問題被誇大其詞,其中一些android的問題在新版本中已不復存在,針對仍然存在的一些問題,本文提供了一些處理方案,同時也為將要開始計畫巨大的android應用的你提供一些提議。上圖分別是google在2010年蒲月計畫的action bar模式提議,...
關於Android螢幕適配應該知道的一些知識
前提 之前公司裡面做的是電視應用,從來沒有遇到過螢幕適配問題,這幾天,公司新拿了乙個盒子,每個控制項尺寸變大,出現了很大的適配問題,所以我們就著手解決android螢幕適配的問題。在做適配前,必須要了解一下螢幕密度dpi dots per inch 螢幕密度就是每英吋有多少個顯示點,可以通過如下的方...
iOS 開發者應該知道的 ARM 結構
這是一篇圍繞 ios 來介紹 arm 結構的文章,用詞簡單,邏輯清楚,偶見幽默。非開發者也值得一讀,權當增長知識。我在寫 neon on iphone 入門 的時候,曾以為讀者已經比較了解 ios 裝置的處理器知識。然而,看過網上的一些討論,我才發現,原來這些知識並不普及,我的錯。此外,我覺得了解這...