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

?

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

目前很多應用都用webview加載H5頁面,如果服務端采用的是可信CA頒發的證書,在 webView.setWebViewClient(webviewClient) 時重載 WebViewClient的onReceivedSslError() ,如果出現證書錯誤,直接調用handler.proceed()會忽略錯誤繼續加載證書有問題的頁面。

?

一 、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;

 
  1. private?static?SSLSocketFactory?buildSSLSocketFactory(Context?context,?
  2. ??????????????????????????????????????????????????????int?certRawResId)?{?
  3. ????KeyStore?keyStore?=?null;?
  4. ????try?{?
  5. ????????keyStore?=?buildKeyStore(context,?certRawResId);?
  6. ????}?catch?(KeyStoreException?e)?{?
  7. ????????e.printStackTrace();?
  8. ????}?catch?(CertificateException?e)?{?
  9. ????????e.printStackTrace();?
  10. ????}?catch?(NoSuchAlgorithmException?e)?{?
  11. ????????e.printStackTrace();?
  12. ????}?catch?(IOException?e)?{?
  13. ????????e.printStackTrace();?
  14. ????}?
  15. ?
  16. ????String?tmfAlgorithm?=?TrustManagerFactory.getDefaultAlgorithm();?
  17. ????TrustManagerFactory?tmf?=?null;?
  18. ????try?{?
  19. ????????tmf?=?TrustManagerFactory.getInstance(tmfAlgorithm);?
  20. ????????tmf.init(keyStore);?
  21. ?
  22. ????}?catch?(NoSuchAlgorithmException?e)?{?
  23. ????????e.printStackTrace();?
  24. ????}?catch?(KeyStoreException?e)?{?
  25. ????????e.printStackTrace();?
  26. ????}?
  27. ?
  28. ????SSLContext?sslContext?=?null;?
  29. ????try?{?
  30. ????????sslContext?=?SSLContext.getInstance("TLS");?
  31. ????}?catch?(NoSuchAlgorithmException?e)?{?
  32. ????????e.printStackTrace();?
  33. ????}?
  34. ????try?{?
  35. ????????sslContext.init(null,?tmf.getTrustManagers(),?null);?
  36. ????}?catch?(KeyManagementException?e)?{?
  37. ????????e.printStackTrace();?
  38. ????}?
  39. ?
  40. ????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 強校驗證書的方式來校驗服務端證書,如果校驗不通過停止加載網頁。當然這樣會拖慢網頁的加載速度,需要進一步優化,具體優化的辦法不在本次討論范圍,這里也不詳細講解了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386948.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cookie、cookie使用方法

Cookie、cookie使用方法、保存用戶名密碼 //設置Cookie,//cname 獲取時所需參數//username,password 用于記住賬號密碼,如果只要存一個參數 password為空即可//exdays 設置過期參數 設為負數即可刪除(如-1)function setCookie(c…

RUNOOB python練習題12 找素數問題

用來練手的python 練習題,原鏈接 : python練習實例12 題干 : 判斷101-200之間有多少個素數,并輸出所有素數 源代碼如下: import numpy as np bound np.arange(101,201,1) result np.array([]) for k in bound:for i in range(k):# 如果k存在不是1或…

Linux: centOS6.5 RabbitMQ

在大多數大公司,像應用服務器軟件的安裝、部署都是運維的事情,其實自己去嘗試部署一下,也是有收獲的。 有機會正好嘗試了Linux下的rabbitMq安裝過程,做了記錄,希望有用到的人可以做下參考。 安裝環境: Li…

RUNOOB python練習題13 水仙花數

用來練手的python 練習題其十三,原鏈接 : python練習實例13 題干 : 打印出所有的"水仙花數",所謂"水仙花數"是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個"水仙花數",…

OsharpNS輕量級.net core快速開發框架簡明入門教程-代碼生成器的使用

OsharpNS輕量級.net core快速開發框架簡明入門教程 教程目錄 從零開始啟動Osharp 1.1. 使用OsharpNS項目模板創建項目 1.2. 配置數據庫連接串并啟動項目 1.3. OsharpNS.Swagger使用實例(登錄和授權) 1.4. Angular6的前端項目啟動Osharp代碼生成器的使用 2.1 生成器的使用 2.2 生…

RUNOOB python練習題 14

用來練手的python 練習題其十四,原鏈接 : python練習實例14 題干 : 將一個正整數分解質因數。例如:輸入90,打印出90233*5。 拿到題目,我們就可以看出,首先我們需要一個函數來判斷某一正整數是否為質數,然后還需要一個…

關于作者

北京某公司滲透工程師 Web滲透、PHP/Java代碼審計、安全研究 想換一份工作,求推薦。轉載于:https://www.cnblogs.com/dgjnszf/p/10779097.html

centos7通過yum安裝JDK1.8

安裝之前先檢查一下系統有沒有自帶open-jdk 命令: rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果沒有輸入信息表示沒有安裝。 如果安裝可以使用rpm -qa | grep java | xargs rpm -e --nodeps 批量卸載所有帶有Java的文件 這句命令的關鍵字是j…

一個電腦的重裝到java開發環境安裝配置的全過程

剛拿到一臺別人用過的電腦。看著c盤爆滿,而且用了還是windows7操作系統,強迫癥發作馬上就準備重裝系統。 之前換固態使用wepe制作U盤啟動盤裝系統的步驟和過程全部忘記的,賊尷尬。 同事都看不過眼了 使用UltraISO這個軟件幫我做了U盤啟動盤 …

RUNOOB python練習題17

用來練手的python 練習題其十三,原鏈接 : python練習實例17 題干 : 輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數 這個例題讓我回憶起了遠古的記憶,python str類的 isalpha,isspace,isdigit方法。這些方法通過比較ASC…

Centos7下使用ELK(Elasticsearch + Logstash + Kibana)搭建日志集中分析平臺

Centos7下使用ELK(Elasticsearch Logstash Kibana)搭建日志集中分析平臺 日志監控和分析在保障業務穩定運行時,起到了很重要的作用,不過一般情況下日志都分散在各個生產服務器,且開發人員無法登陸生產服務器&#xf…

疊數的加法與字符串 RUNOOB python練習題 18

用來練手的python 練習題其十八,原鏈接 : python練習實例18 題干: 求saaaaaaaaaaaa…a的值,其中a是一個數字。例如222222222222222(此時共有5個數相加),幾個數相加由鍵盤控制 這種類型的疊數相加,讓我不禁聯想到了python中&…

wget在linux中安裝出現錯誤解決辦法

在使用wget命令報錯 certificate common name xxx doesnt match requestde host name,我們一般的解決辦法是查找下載地址,但是有時候更換地址也會發生錯誤, wget http://www.monkey.org/~provos/libevent-1.2.tar.gz 報如下錯: er…

linux下elasticsearch的安裝

首先安裝jdk 下載elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz 解壓 tar -zxvf elasticsearch-6.2.4.tar.gz 移動項目到/usr目錄下 mv elasticsearch-6.2.4 /usr 啟動es /usr/elasticsearch-6.4.2/bin/elastic…

RUNOOB python練習題19 找出1000以內的所有完數

用來練手的python 練習題,原鏈接 : python練習實例19 題干: 一個數如果恰好等于它的因子之和,這個數就稱為"完數"。例如61+2+3.編程找出1000以內的所有完數。 首先我們要理解,什么是完數。根據百度詞條&am…

金蝶學習網站

https //vip.kingdee.com/轉載于:https://www.cnblogs.com/RogerLu/p/10784498.html

Kibana linux下安裝

1、kibana簡介 Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的數據,使用各種不同的圖表、表格、地圖等kibana能夠很輕易地展示高級數據分析與可視化。 Kiban…

RUNOOB python練習題 23 使用*號輸出菱形

用來練手的python練習題,原題鏈接:python練習實例23 題干: 這個題目還是利用python字符串的乘法等性質,通過循環打印出我們想要的圖形。 源代碼如下: for i in range(4):character " " * (3-i) "*" * ((i1)*2-1)print(charact…

nohup /dev/null 21 含義詳解

nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那么可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之后繼續運行相應的進程。nohup就是不掛起的意思( n ohang up)。 該命令的一般形式為:nohup…

RUNOOB python練習題24 斐波那契數列的衍生問題

用來練手的python練習題,原題鏈接 : python練習實例24 題干: 有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。 拿到題目觀察數列,我們不難發現,…