Android okhttp3.0忽略https證書(shū)的方法
最近公司項(xiàng)目需要,網(wǎng)絡(luò)協(xié)議支持https,之前接觸不多,所以這次想總結(jié)一下https在android開(kāi)發(fā)中的相關(guān)內(nèi)容
一、https證書(shū)
對(duì)于https和證書(shū)的概念,大家可以自行搜索百度。
證書(shū)分兩種:
1、花錢(qián)向認(rèn)證機(jī)構(gòu)購(gòu)買(mǎi)的證書(shū),(我們公司買(mǎi)的證書(shū)一個(gè)就需要4000元,TMD,還不如多租一臺(tái)服務(wù)器)。服務(wù)器如果使用了此類證書(shū)的話,那對(duì)于移動(dòng)端來(lái)說(shuō),直接可以忽略此證書(shū),直接用https訪問(wèn)。與之不同的是ios內(nèi)置了很多信任的證書(shū),所以他們不需要做任何操作
2、另一種是自己制作的證書(shū),使用此類證書(shū)的話是不受信任的,也不需要花錢(qián),所以需要我們?cè)诖a中將此類證書(shū)設(shè)置為信任證書(shū)
二、如何忽略證書(shū)
1、服務(wù)器的哥們?nèi)绻由狭俗C書(shū)的話,那么你們的網(wǎng)絡(luò)請(qǐng)求的url將從http:xx改成https:xx,如果你直接也將http改成https的話而什么也不做的話,客戶端將直接報(bào)錯(cuò),如圖:
意思就是沒(méi)有找到本地證書(shū),那就開(kāi)始構(gòu)建一個(gè)SSL來(lái)信任所有的證書(shū),忽略證書(shū)其實(shí)就是如此。
2、新建一個(gè)類
public class SSLSocketClient { //獲取這個(gè)SSLSocketFactory public static SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, getTrustManager(), new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } //獲取TrustManager private static TrustManager[] getTrustManager() { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; return trustAllCerts; } }
通過(guò)這個(gè)類我們可以獲得SSLSocketFactory,這個(gè)東西就是用來(lái)管理證書(shū)和信任證書(shū)的
但是有一點(diǎn)需要注意:
然后我們?cè)趏khttp中設(shè)置SSLSocketFactory,如圖:
運(yùn)行之后,發(fā)現(xiàn)還是會(huì)報(bào)錯(cuò),如圖:
意思是我們的請(qǐng)求證書(shū)和服務(wù)器的證書(shū)不一致,這是因?yàn)槲覀冞€需要配置一個(gè)HostnameVerifier來(lái)忽略host驗(yàn)證
三、在SSLSocketClient的類中再加入一個(gè)方法:
//獲取HostnameVerifier public static HostnameVerifier getHostnameVerifier() { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; return hostnameVerifier; }
然后再okhttp中配置一下HostnameVerifier:
在運(yùn)行,可以正常訪問(wèn)了
四、整體配置
copy整個(gè)工具類到你的項(xiàng)目中:
/** * Created by Anonymous on 2017/6/13. */ public class SSLSocketClient { //獲取這個(gè)SSLSocketFactory public static SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, getTrustManager(), new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } //獲取TrustManager private static TrustManager[] getTrustManager() { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; return trustAllCerts; } //獲取HostnameVerifier public static HostnameVerifier getHostnameVerifier() { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; return hostnameVerifier; } }
然后再okhttp中配置
mHttpClient = new OkHttpClient().newBuilder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .addInterceptor(new LogInterceptor()) .addInterceptor(new TokenInterceptor()) .sslSocketFactory(SSLSocketClient.getSSLSocketFactory())//配置 .hostnameVerifier(SSLSocketClient.getHostnameVerifier())//配置 .build();
如果你用的是retrofit,在retrofit中配置一下okhttp即可
retrofitAPI = new Retrofit.Builder() .baseUrl(AppConfig.baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(mHttpClient)//配置okhttp .build() .create(RetrofitAPI.class);
這樣你就可以忽略https證書(shū)正常訪問(wèn)你的網(wǎng)絡(luò)了,本人android小白,說(shuō)的不對(duì)了,希望大神能指出,也希望大家多多支持腳本之家。
相關(guān)文章
Android ViewGroup事件分發(fā)和處理源碼分析
這篇文章主要為大家介紹了Android ViewGroup事件分發(fā)和處理源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android Dialog 設(shè)置字體大小的具體方法
這篇文章介紹了Android Dialog 設(shè)置字體大小的具體方法,希望能幫助到有同樣需求的朋友,可能我的方法不是最好的,也希望有朋友指點(diǎn)2013-09-09Android手勢(shì)滑動(dòng)實(shí)現(xiàn)兩點(diǎn)觸摸縮放圖片
這篇文章主要介紹了Android手勢(shì)滑動(dòng)實(shí)現(xiàn)兩點(diǎn)觸摸縮放圖片的相關(guān)資料,需要的朋友可以參考下2016-02-02漂亮的Android音樂(lè)歌詞控件 仿網(wǎng)易云音樂(lè)滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了漂亮的Android音樂(lè)歌詞控件,仿網(wǎng)易云音樂(lè)滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程
最近在項(xiàng)目中要用到曲線圖,于是在網(wǎng)上找了很多很多,有AChartengine,MPAndroidChart,helloChart等等,我還用過(guò)基于html5的jsChart來(lái)做過(guò),不過(guò)最終還是選擇了MPAndroidChart來(lái)做本文介紹了Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程,需要的朋友可以參考下。2018-03-03Android實(shí)現(xiàn)QQ側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)QQ側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android斬首行動(dòng)接口預(yù)請(qǐng)求
這篇文章主要為大家介紹了Android斬首行動(dòng)之接口預(yù)請(qǐng)求實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03基于Android實(shí)現(xiàn)百度地圖定位過(guò)程詳解
這篇文章主要介紹了基于Android實(shí)現(xiàn)百度地圖定位過(guò)程詳解,需要的朋友可以參考下2015-11-11Android復(fù)選框CheckBox與開(kāi)關(guān)按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復(fù)選框CheckBox與開(kāi)關(guān)按鈕Switch及單選按鈕RadioButton使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09