国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android okhttp3.0忽略https證書的方法

2019-10-22 18:19:46
字體:
來源:轉載
供稿:網友

最近公司項目需要,網絡協議支持https,之前接觸不多,所以這次想總結一下https在android開發中的相關內容

一、https證書

對于https和證書的概念,大家可以自行搜索百度。

證書分兩種:

1、花錢向認證機構購買的證書,(我們公司買的證書一個就需要4000元,TMD,還不如多租一臺服務器)。服務器如果使用了此類證書的話,那對于移動端來說,直接可以忽略此證書,直接用https訪問。與之不同的是ios內置了很多信任的證書,所以他們不需要做任何操作

2、另一種是自己制作的證書,使用此類證書的話是不受信任的,也不需要花錢,所以需要我們在代碼中將此類證書設置為信任證書

二、如何忽略證書

1、服務器的哥們如果加上了證書的話,那么你們的網絡請求的url將從http:xx改成https:xx,如果你直接也將http改成https的話而什么也不做的話,客戶端將直接報錯,如圖:

okhttp,忽略,https證書,okhttps,忽略證書驗證,忽略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,忽略,https證書,okhttps,忽略證書驗證,忽略https證書

然后我們在okhttp中設置SSLSocketFactory,如圖:

okhttp,忽略,https證書,okhttps,忽略證書驗證,忽略https證書

運行之后,發現還是會報錯,如圖:

okhttp,忽略,https證書,okhttps,忽略證書驗證,忽略https證書

意思是我們的請求證書和服務器的證書不一致,這是因為我們還需要配置一個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:

okhttp,忽略,https證書,okhttps,忽略證書驗證,忽略https證書

在運行,可以正常訪問了

四、整體配置

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); 

這樣你就可以忽略https證書正常訪問你的網絡了,本人android小白,說的不對了,希望大神能指出,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盐山县| 蚌埠市| 乌海市| 宝兴县| 枣强县| 闻喜县| 肥东县| 泰州市| 连云港市| 遵化市| 长武县| 扶沟县| 五大连池市| 鹤山市| 铁岭县| 察隅县| 周宁县| 旬阳县| 岱山县| 金堂县| 静乐县| 抚远县| 乌鲁木齐市| 左权县| 丰县| 汨罗市| 萨迦县| 华池县| 鸡西市| 闽清县| 临沂市| 珠海市| 武穴市| 蓝山县| 桐城市| 霍城县| 民县| 滁州市| 靖边县| 通州市| 临清市|