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

首頁 > 系統 > Android > 正文

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

2019-12-12 01:27:08
字體:
來源:轉載
供稿:網友

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵台县| 贵港市| 平度市| 襄城县| 洛阳市| 怀化市| 沈阳市| 井冈山市| 广水市| 微山县| 天台县| 阿合奇县| 德庆县| 朔州市| 资兴市| 沂南县| 上犹县| 成武县| 龙口市| 永吉县| 隆尧县| 时尚| 万源市| 柘荣县| 延边| 大冶市| 万州区| 义乌市| 临桂县| 鄂伦春自治旗| 德州市| 安福县| 陇西县| 新竹市| 洛浦县| 旬邑县| 玉环县| 沈丘县| 通榆县| 吉木乃县| 金华市|