這篇文章主要介紹了Android中okhttp3.0如何忽略https證書,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都服務器托管,創新互聯公司提供包括服務器租用、服務器托管、帶寬租用、云主機、機柜租用、主機租用托管、CDN網站加速、域名與空間等業務的一體化完整服務。電話咨詢:028-86922220
一、https證書
對于https和證書的概念,大家可以自行搜索百度。
證書分兩種:
1、花錢向認證機構購買的證書,(我們公司買的證書一個就需要4000元,TMD,還不如多租一臺服務器)。服務器如果使用了此類證書的話,那對于移動端來說,直接可以忽略此證書,直接用https訪問。與之不同的是ios內置了很多信任的證書,所以他們不需要做任何操作
2、另一種是自己制作的證書,使用此類證書的話是不受信任的,也不需要花錢,所以需要我們在代碼中將此類證書設置為信任證書
二、如何忽略證書
1、服務器的哥們如果加上了證書的話,那么你們的網絡請求的url將從http:xx改成https:xx,如果你直接也將http改成https的話而什么也不做的話,客戶端將直接報錯,如圖:
意思就是沒有找到本地證書,那就開始構建一個SSL來信任所有的證書,忽略證書其實就是如此。
2、新建一個類
public class SSLSocketClient { //獲取這個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; } }
通過這個類我們可以獲得SSLSocketFactory,這個東西就是用來管理證書和信任證書的
但是有一點需要注意:
然后我們在okhttp中設置SSLSocketFactory,如圖:
運行之后,發現還是會報錯,如圖:
意思是我們的請求證書和服務器的證書不一致,這是因為我們還需要配置一個HostnameVerifier來忽略host驗證
三、在SSLSocketClient的類中再加入一個方法:
//獲取HostnameVerifier public static HostnameVerifier getHostnameVerifier() { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; return hostnameVerifier; }
然后再okhttp中配置一下HostnameVerifier:
在運行,可以正常訪問了
四、整體配置
copy整個工具類到你的項目中:
/** * Created by Anonymous on 2017/6/13. */ public class SSLSocketClient { //獲取這個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);
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Android中okhttp3.0如何忽略https證書”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯,關注創新互聯行業資訊頻道,更多相關知識等著你來學習!
網頁名稱:Android中okhttp3.0如何忽略https證書
文章來源:http://vcdvsql.cn/article4/gjesoe.html
成都網站建設公司_創新互聯,為您提供、網站排名、App開發、小程序開發、靜態網站、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯