溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中okhttp3.0如何忽略https證書

發(fā)布時間:2021-08-04 14:16:42 來源:億速云 閱讀:152 作者:小新 欄目:移動開發(fā)

這篇文章主要介紹了Android中okhttp3.0如何忽略https證書,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、https證書

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

證書分兩種:

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

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

二、如何忽略證書

1、服務(wù)器的哥們?nèi)绻由狭俗C書的話,那么你們的網(wǎng)絡(luò)請求的url將從http:xx改成https:xx,如果你直接也將http改成https的話而什么也不做的話,客戶端將直接報錯,如圖:

Android中okhttp3.0如何忽略https證書

意思就是沒有找到本地證書,那就開始構(gòu)建一個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,這個東西就是用來管理證書和信任證書的

但是有一點需要注意:

Android中okhttp3.0如何忽略https證書

然后我們在okhttp中設(shè)置SSLSocketFactory,如圖:

Android中okhttp3.0如何忽略https證書

運行之后,發(fā)現(xiàn)還是會報錯,如圖:

Android中okhttp3.0如何忽略https證書

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

Android中okhttp3.0如何忽略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);

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Android中okhttp3.0如何忽略https證書”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI