栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android okhttp3.0忽略https证书的方法

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android okhttp3.0忽略https证书的方法

最近公司项目需要,网络协议支持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整个工具类到你的项目中:

 
 
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小白,说的不对了,希望大神能指出,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156918.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号