首頁  >  文章  >  系統教程  >  詳解HTTPS連接過程以及中間人攻擊劫持

詳解HTTPS連接過程以及中間人攻擊劫持

PHPz
PHPz原創
2024-06-16 10:52:26290瀏覽
一 、HTTPS連結過程及中間人攻擊原理

#https協議就是http+ssl協議,如下圖所示為其連接流程:
詳解HTTPS連接過程以及中間人攻擊劫持

1.https請求

#客戶端向服務端發送https請求;

2.產生公鑰與私鑰

服務端收到請求之後,產生公鑰和私鑰。公鑰相當於鎖,私鑰相當於是鑰匙,只有私鑰才能夠打開公鑰鎖住的內容;

3.傳回公鑰

#服務端將公鑰(憑證)傳回給客戶端,公鑰裡麵包含有很多訊息,例如憑證的頒發機構、過期時間等等;

4.客戶端驗證公鑰

#客戶端收到公鑰之後,首先會驗證其是否有效,如頒發機構或過期時間等,如果發現有問題就會拋出異常,提示憑證存在問題。如果沒有問題,那麼就產生一個隨機值,作為客戶端的金鑰,然後用服務端的公鑰加密;

5.傳送客戶端金鑰

#客戶端以服務端的公鑰加密金鑰,然後傳送給服務端。

6.服務端收取金鑰,對稱加密內容

服務端收到經過加密的金鑰,然後用私鑰將其解密,得到客戶端的金鑰,然後服務端把要傳輸的內容和客戶端的金鑰進行對稱加密,這樣除非知道金鑰,否則無法知道傳輸的內容。

7.加密傳輸

#服務端將經過加密的內容傳送給客戶端。

8.取得加密內容,解密

#客戶端取得加密內容後,用先前產生的金鑰對其進行解密,取得到內容。

中間人劫持攻擊

#https也不是絕對安全的,如下圖所示為中間人劫持攻擊,中間人可以取得到客戶端與伺服器之間所有的通訊內容。
詳解HTTPS連接過程以及中間人攻擊劫持

中間人截取客戶端傳送給伺服器的請求,然後偽裝成客戶端與伺服器進行通訊;將伺服器傳回給客戶端的內容傳送給客戶端,偽裝成伺服器與客戶端進行通訊。
透過這樣的手段,便可以獲得客戶端和伺服器之間通訊的所有內容。
使用中間人攻擊手段,必須要讓客戶端信任中間人的證書,如果客戶端不信任,這種攻擊手段也無法發揮作用。

二、中間人攻擊的預防

造成中間人劫持的原因是 沒有對服務端憑證及網域做校驗或校驗不完整,為了方便,直接採用開源框架預設的校驗方式進行https請求

如volley

詳解HTTPS連接過程以及中間人攻擊劫持

詳解HTTPS連接過程以及中間人攻擊劫持

##OKhttp3.0

詳解HTTPS連接過程以及中間人攻擊劫持

#預防方法:

預防方式有兩種

1 、針對安全性要求比較高的app,可採取客戶端預埋證書的方式鎖死證書,只有當客戶端證書和服務端的證書完全一致的情況下才允許通信,如一些銀行類的app,但這種方式面臨一個問題,憑證過期的問題,因憑證有一定的有效期,當預埋憑證過期了,只有透過強制更新或要求使用者下載憑證來解決。

以volley為例:校驗的實作方式如下

透過預埋憑證建立 SSLSocketFactory;

private static SSLSocketFactory buildSSLSocketFactory(Context context,
                                                      int certRawResId) {
    KeyStore keyStore = null;
    try {
        keyStore = buildKeyStore(context, certRawResId);
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = null;
    try {
        tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    }

    SSLContext sslContext = null;
    try {
        sslContext = SSLContext.getInstance("TLS");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        sslContext.init(null, tmf.getTrustManagers(), null);
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    return sslContext.getSocketFactory();

產生 經過ssl校驗及 域名校驗的connection
詳解HTTPS連接過程以及中間人攻擊劫持

詳解HTTPS連接過程以及中間人攻擊劫持

#2 針對安全性要求一般的app,可採用通過校驗域名,證書有效性、證書關鍵資訊及證書鏈的方式

以volley為例,重寫HTTPSTrustManager 中的checkServerTrusted 方法,同時開啟網域強校驗

三 Webview的HTTPS安全性

目前很多應用程式都用webview載入H5頁面,如果服務端採用的是可信任CA頒發的證書,在webView.setWebViewClient(webviewClient) 時重載WebViewClient的onReceivedSslError() ,如果出現憑證錯誤,直接呼叫handler .proceed()會忽略錯誤繼續載入憑證有問題的頁面,如果呼叫handler.cancel()可以終止載入憑證有問題的頁面,憑證出現問題了,可以提示使用者風險,讓使用者選擇載入與否,如果是需要安全等級比較高,可以直接終止頁面加載,提示使用者網路環境有風險:

詳解HTTPS連接過程以及中間人攻擊劫持

#不建議直接用handler.proceed()。如果webview載入https需要強校驗服務端證書,可以在 onPageStarted() 中用 HttpsURLConnection 強校驗證書的方式來校驗服務端證書,如果校驗不透過停止載入網頁。當然這樣會拖慢網頁的載入速度,需要進一步優化,具體優化的辦法不在本次討論範圍,這裡也不詳細解說了。

以上是詳解HTTPS連接過程以及中間人攻擊劫持的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn