一、https证书

对于https和证书的概念,大家可以自行搜索百度。

证书分两种:

1、花钱向认证机构购买的证书,(我们公司买的证书一个就需要4000元,TMD,还不如多租一台服务器)。服务器如果使用了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接用https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作

2、另一种是自己制作的证书,使用此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书

二、如何忽略证书

1、服务器的哥们如果加上了证书的话,那么你们的网络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话而什么也不做的话,客户端将直接报错,如图:

Okhttp3.0忽略https证书_java

意思就是没有找到本地证书,那就开始构建一个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,这个东西就是用来管理证书和信任证书的
但是有一点需要注意:


Okhttp3.0忽略https证书_java_02

然后我们在okhttp中设置SSLSocketFactory,如图:

Okhttp3.0忽略https证书_java_03

运行之后,发现还是会报错,如图:

Okhttp3.0忽略https证书_java_04

意思是我们的请求证书和服务器的证书不一致,这是因为我们还需要配置一个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中配置

new OkHttpClient().newBuilder()  
                    .sslSocketFactory(SSLSocketClient.getSSLSocketFactory())  
                    .hostnameVerifier(SSLSocketClient.getHostnameVerifier())  
                    .build();

如果你用的是retrofit,在retrofit中配置一下okhttp即可

 new Retrofit.Builder()  
                    .baseUrl(AppConfig.baseUrl)  
                    .addConverterFactory(GsonConverterFactory.create())  
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
                    .client(mHttpClient)//配置okhttp  
                    .build()

这样你就可以忽略https证书正常访问你的网络了,本人android小白,说的不对了,希望大神能指出,谢谢!