android报错:“Chain validation failed”解决方案

25,996 阅读1分钟

一、报错原因

出现“Chain validation failed”的原因是因为当前访问网站的证书失效,如下图:


因为android在进行访问网站时会自动检验该网站的证书是否有效,以保证应用程序的安全性。

但当前访问网站的证书过期,所以就会报错。


二、解决方案

有很多解决方案,我百度后的解决方案是:

//客户端不对服务器证书做任何验证
public static SSLSocketFactory getSSLSocketFactory() throws Exception {
    //创建一个不验证证书链的证书信任管理器。
    final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        @Override
        public void checkClientTrusted(
                java.security.cert.X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(
                java.security.cert.X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[0];
        }
    }};

    // Install the all-trusting trust manager
    final SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustAllCerts,
            new java.security.SecureRandom());
    // Create an ssl socket factory with our all-trusting manager
    return sslContext.getSocketFactory();
}

//获得无需验证任何证书的OkHttpClient实例对象
public static OkHttpClient getOkHttpClientInstance(){
    try{
        return new okhttp3.OkHttpClient.Builder()
                .sslSocketFactory(getSSLSocketFactory())
                .readTimeout(10, TimeUnit.SECONDS)
                .connectTimeout(10, TimeUnit.SECONDS)
                .build();
    }catch (Exception e){
        Log.e("OkHttpClientError", e.getMessage());
    }
    return null;
}

创建上述两个方法后,再在第三方库Retrofit定义时,自定义使用.client(RequestDataByRetrofit.getOkHttpClientInstance())即可,如下:

retrofit2.Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://gank.io/api/")
        .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
        .client(RequestDataByRetrofit.getOkHttpClientInstance())
        .build();


当时百度,看到一篇很好的解决该问题的简书,并讲解了多种解决方案,但现在找不到在哪儿了,后续找到再补上。