okhttp3.0忽略https证书

Posted Anonymous-OS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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小白,说的不对了,希望大神能指出,谢谢!


下一篇将会涉及到 glide如何忽略证书访问https图片

以上是关于okhttp3.0忽略https证书的主要内容,如果未能解决你的问题,请参考以下文章

Glide3.0加载https图片

Glide3.0加载https图片

HttpClient 怎么忽略证书验证访问https

iOS https请求对自签名证书忽略

c# https请求忽略证书验证_各种编程语言忽略http的SSL证书认证

OkHttp使用https,忽略证书验证