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

 更新时间:2017年12月18日 16:52:32   作者:Anonymous-OS  
这篇文章主要介绍了 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整个工具类到你的项目中:

/** 
 * 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小白,说的不对了,希望大神能指出,也希望大家多多支持脚本之家。

相关文章

  • android listview进阶实例分享

    android listview进阶实例分享

    这篇文章主要介绍了android listview进阶实例分享,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Android自定义图文跑马灯效果

    Android自定义图文跑马灯效果

    这篇文章主要为大家详细介绍了Android自定义图文跑马灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Android模拟美团客户端进度提示框

    Android模拟美团客户端进度提示框

    这篇文章主要为大家详细介绍了Android模拟美团客户端进度提示框的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • Android 详解沉浸式状态栏的实现流程

    Android 详解沉浸式状态栏的实现流程

    沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉。沉浸式模式就是整个屏幕中显示都是应用的内容,没有状态栏也没有导航栏,用户不会被一些系统的界面元素所打扰,让我们来实现下网上传的沸沸扬扬的安卓沉浸式状态栏
    2021-11-11
  • Android onClick按钮单击事件的四种常用写法

    Android onClick按钮单击事件的四种常用写法

    本文主要介绍了Android onClick按钮单击事件的四种常用写法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 利用Android模仿微信摄像圆环进度效果实例

    利用Android模仿微信摄像圆环进度效果实例

    圆环进度条,大家应该都见过,而这篇文章主要给大家介绍了关于利用Android模仿微信摄像圆环进度效果的相关资料,实现后的效果非常不错,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Android解决dialog弹出时无法捕捉Activity的back事件的方法

    Android解决dialog弹出时无法捕捉Activity的back事件的方法

    这篇文章主要介绍了Android解决dialog弹出时无法捕捉Activity的back事件的方法,涉及Android操作Activity事件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Android 不解压直接读取zip包的方法

    Android 不解压直接读取zip包的方法

    下面小编就为大家分享一篇Android 不解压直接读取zip包的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android仿微信语音聊天界面设计

    Android仿微信语音聊天界面设计

    这篇文章主要为大家详细介绍了Android仿微信语音聊天界面设计代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android编程实现识别与挂载U盘的方法

    Android编程实现识别与挂载U盘的方法

    这篇文章主要介绍了Android编程实现识别与挂载U盘的方法,对比分析了Android针对U盘的识别与挂载技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-02-02

最新评论