一区二区三区欧美日韩-一区二区三区欧美-一区二区三区免费在线视频-一区二区三区免费在线观看-久久精品店-久久精品第一页

歡迎您光臨深圳塔燈網絡科技有限公司!
電話圖標 余先生:13699882642

網站百科

為您解碼網站建設的點點滴滴

Android 證書鎖

發表日期:2016-12 文章編輯:小燈 瀏覽次數:2858


在講解本篇文章之前可以先簡單了解一下關于Https、TLS/SSL和CA證書的基礎知識

為什么需要數字證書鎖

在Android設備中,一般由系統校驗服務端數字證書的合法性,用可信CA簽發的數字證書的網站才可以正常訪問,私有簽發的數字證書的網站無法訪問(需要手動安裝證書并信任)。這種作法不能抵御在用戶設備上安裝證書(將中間人服務器的證書放到設備的信任列表中,如charles的對https抓包的做法)進行中間人攻擊。如果客戶端沒有做任何主動性的防御,很可能被不法分子利用偽造CA證書進行中間人攻擊。受信任的CA(證書頒發機構)有好幾百個,任何一家受信任的CA都可以簽發任意網站的證書,這些證書在客戶端看來都是合法的。如果客戶端使用證書鎖,它會強制校驗服務端的證書,一旦發現不匹配就會禁止通信。

android證書鎖的用法

** 1、Certificate Pinning**
其實Certificate Pinning是OkHttp 實現的一個類似于HPKP的技術,目的是為了使客戶端可以有主動的信任CA的權利,它的工作原理就是使用預先設置的證書指紋和服務器傳過來的證書鏈中的證書指紋進行匹配,只要有任何一對指紋匹配成功,則認為是一次合法的連接,否則禁止本次鏈接

** 2、預埋證書**
把數字證書以文件或者字符串的形式寫在本地,在SSL握手的時候用本地預埋的證書和服務器傳過來的證書進行匹配,如果匹配不成功則禁止本次通信

Certificate Pinning和預埋證書做法的比較

先貼上代碼 以OkHttp為例
** 預埋證書的寫法**
首先定義一個類實現類實現X509TrustManager接口,實現對客戶端證書鏈的校驗方法和服務端證書鏈的校驗方法,不寫的話表示不做任何校驗,默認信任所有證書鏈中的證書

證書信任管理器

讀取客戶端預埋的證書


預埋的證書

配置Client

new OkHttpClient.Builder() .sslSocketFactory(getSSLFactory(),new MyX509TrustManager).build(); 

Certificate Pinning的寫法

妥妥的幾行代碼搞定

new OkHttpClient.Builder() .certificatePinner(new CertificatePinner.Builder() .add("b.public.com", "sha256/**********") .add("b.public.com", "sha256/**********") .add("b.public.com", "sha256/**********") .build()) .build(); 

兩種做法相比較之下,Certificate Pinning更為簡潔,并且也把指紋和hostname 綁定起來,這樣做的好處就是對指定的hostname所在服務器發送過來的證書指紋進行校驗,在一定程度上既控制了證書信任同時也考慮到了靈活性。而預埋證書的做法要實現相同的功能,僅僅實現上述代碼還不夠,還需要在Client配置的時候加上hostnameVerifier校驗。

** 完整代碼的實現**

 String hostname = "publicobject.com"; String pinner = "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; CertificatePinner certificatePinner = new CertificatePinner.Builder() .add(hostname,pinner) .build();OkHttpClient client = OkHttpClient.Builder() .certificatePinner(certificatePinner) .build(); Request request = new Request.Builder() .url("https://" + hostname) .build(); client.newCall(request).execute(); 

pinner就是證書指紋,sha256表示的是哈希值得一種算法,pinner也可以是 sha1/*********** ,具體pinner要根據購買證書所支持的配置,SSL Labs這個服務通過hostname可以查看的證書指紋。
在SSL握手的時候,會檢查配置中的指紋和服務端傳過來的證書證的指紋是否相匹配,只要有一個指紋匹配,則進行下一步,否則直接拋出異常,禁止本次連接。相關源代碼實現如下:

public void check(String hostname, List<Certificate> peerCertificates) throws SSLPeerUnverifiedException { List<Pin> pins = findMatchingPins(hostname); if (pins.isEmpty()) return;if (certificateChainCleaner != null) { peerCertificates = certificateChainCleaner.clean(peerCertificates, hostname); }for (int c = 0, certsSize = peerCertificates.size(); c < certsSize; c++) { X509Certificate x509Certificate = (X509Certificate) peerCertificates.get(c);// Lazily compute the hashes for each certificate. ByteString sha1 = null; ByteString sha256 = null;for (int p = 0, pinsSize = pins.size(); p < pinsSize; p++) { Pin pin = pins.get(p); if (pin.hashAlgorithm.equals("sha256/")) { if (sha256 == null) sha256 = sha256(x509Certificate); if (pin.hash.equals(sha256)) return; // Success! } else if (pin.hashAlgorithm.equals("sha1/")) { if (sha1 == null) sha1 = sha1(x509Certificate); if (pin.hash.equals(sha1)) return; // Success! } else { throw new AssertionError(); } } } 

OkHttpClient驗證證書指紋,在CertificatePinner類中有該方法的作用是確認證書中至少有一個和綁定的指紋是否匹配;如果匹配則Okhttp認為TLS握手成功,如果不匹配則失敗,并且拋出SSLPerrUnverifiedException異常。(如果沒有證書綁定,則OKHttp認為TLS握手成功)。具體調用過程和實現細節可以查看OkHttp的RealConnection這個類。

關于中間人攻擊

目前在網絡通信中,中間人的存在是無法杜絕的,因為中間人利用的不是漏洞,而是利用網絡協議本身的特性。只要是它又能里轉發數據包,并且實現相應的網絡協議,就可以接入到終端和服務器之間實現中間人攻擊。
在HTTPS網絡中想做中間人攻擊,必須要在握手之前接入到網絡中,一旦HTTPS握手過程結束,之后傳輸的數據完全都是加密的,解密非常的困難。想要破解加密的數據最簡單的方法就是知道瀏覽器和網站協商的那個密碼是什么,但是密碼還是在握手過程中被RSA,DSA這種非對稱加密算法加密的,不知道私鑰還沒有辦法解密,同時瀏覽器和網站之間到底使用什么加密算法來進行加密還是在握手之間協商的,而這些方法都是保存在發給瀏覽器的證書中,于是最簡單的方法就是偽造一個證書,同時要實現TLS協議,在握手開始前進行中間人攻擊。另外,HTTPS握手過程對密碼協商的驗證是很嚴格的,中間驗證數據的環節一旦有異常,瀏覽器和網站都會中斷連接,因此偽造SSL證書進行中間人攻擊目前是對HTTPS網絡最好攻擊方式,但是偽造的證書無法經過瀏覽器的受信檢查會給出提示。


中間人攻擊圖

更多關于各種中間人攻擊的相關知識,我推薦這篇文章,里面有各種攻擊手段和原理講解(http://www.cnblogs.com/LittleHann/p/3741907.html)

相關文章

HTTPS基礎知識
TLS/SSL工作原理
TLS/SSL握手過程
CA證書介紹


本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.junxiaosheng.cn/20407.html
相關開發語言
 八年  行業經驗

多一份參考,總有益處

聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

咨詢相關問題或預約面談,可以通過以下方式與我們聯系

業務熱線:余經理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

  • QQ咨詢
  • 在線咨詢
  • 官方微信
  • 聯系電話
    座機0755-29185426
    手機13699882642
  • 預約上門
  • 返回頂部
主站蜘蛛池模板: 成人小视频在线免费观看| 伊人久久大香线蕉电影院| 国产亚洲精品看片在线观看| 印度学生xxxxx性14一16| 久久人妻无码毛片A片麻豆| yellow在线观看免费观看大全| 十分钟免费观看高清视频大全| 精品久久久噜噜噜久久久app| 纯肉高H种马艳遇风流多| 中国xxx视频| 一个人在线观看的视频| 香蕉99久久久久成人麻豆| 秋秋影视午夜福利高清| 久久精品国产96精品亚洲| 中文日韩亚洲欧美字幕| 精品精品国产yyy5857香蕉| 久久青草免费线观最新| 欧美香蕉大胸在线视频观看| 色狠狠婷婷97| 亚洲视频无码高清在线| 7756短视频| 国产成人国产在线观看入口| 黑色丝袜美女被网站| 狼群资源网中文字幕| 特级毛片内射WWW无码| 黄色三级三级免费看| 欧美亚洲视频在线二区| 亚洲黄色在线观看| 文中字幕一区二区三区视频播放| 欧美一道本一区二区三区| 免费韩国伦理2017最新| 男生插女生下体| 日本人添下面的全过程| 天天躁日日躁狠狠躁午夜剧场| 五月丁香啪啪.| 在线A亚洲老鸭窝天堂AV高清| 国产噜噜噜精品免费| 国产乱色伦影片在线观看| 毛片手机在线| 亚洲欧美日韩国产另类电影| SM调教贱屁股眼哭叫求饶H|