欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android okhttp3.0忽略https證書(shū)的方法

 更新時(shí)間:2017年12月18日 16:52:32   作者:Anonymous-OS  
這篇文章主要介紹了 Android okhttp3.0忽略https證書(shū)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近公司項(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)文章

最新評(píng)論