国产亚洲欧美人成在线,免费视频爱爱太爽了无码,日本免费一区二区三区高清视频 ,国产真实伦对白精彩视频

歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
電話圖標(biāo) 余先生:13699882642

網(wǎng)站百科

為您解碼網(wǎng)站建設(shè)的點點滴滴

Android 證書鎖

發(fā)表日期:2016-12 文章編輯:小燈 瀏覽次數(shù):2866


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

為什么需要數(shù)字證書鎖

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

android證書鎖的用法

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

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

Certificate Pinning和預(yù)埋證書做法的比較

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

證書信任管理器

讀取客戶端預(yù)埋的證書


預(yù)埋的證書

配置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所在服務(wù)器發(fā)送過來的證書指紋進(jìn)行校驗,在一定程度上既控制了證書信任同時也考慮到了靈活性。而預(yù)埋證書的做法要實現(xiàn)相同的功能,僅僅實現(xiàn)上述代碼還不夠,還需要在Client配置的時候加上hostnameVerifier校驗。

** 完整代碼的實現(xiàn)**

 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要根據(jù)購買證書所支持的配置,SSL Labs這個服務(wù)通過hostname可以查看的證書指紋。
在SSL握手的時候,會檢查配置中的指紋和服務(wù)端傳過來的證書證的指紋是否相匹配,只要有一個指紋匹配,則進(jìn)行下一步,否則直接拋出異常,禁止本次連接。相關(guān)源代碼實現(xiàn)如下:

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類中有該方法的作用是確認(rèn)證書中至少有一個和綁定的指紋是否匹配;如果匹配則Okhttp認(rèn)為TLS握手成功,如果不匹配則失敗,并且拋出SSLPerrUnverifiedException異常。(如果沒有證書綁定,則OKHttp認(rèn)為TLS握手成功)。具體調(diào)用過程和實現(xiàn)細(xì)節(jié)可以查看OkHttp的RealConnection這個類。

關(guān)于中間人攻擊

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


中間人攻擊圖

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

相關(guān)文章

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


本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請及時與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會在5工作日內(nèi)聯(lián)系您,一經(jīng)查實,本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://jstctz.cn/20407.html
相關(guān)開發(fā)語言
 八年  行業(yè)經(jīng)驗

多一份參考,總有益處

聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費獲得網(wǎng)站建設(shè)方案及報價

咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

業(yè)務(wù)熱線:余經(jīng)理:13699882642

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

  • QQ咨詢
  • 在線咨詢
  • 官方微信
  • 聯(lián)系電話
    座機(jī)0755-29185426
    手機(jī)13699882642
  • 預(yù)約上門
  • 返回頂部