一、报错原因
出现“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();当时百度,看到一篇很好的解决该问题的简书,并讲解了多种解决方案,但现在找不到在哪儿了,后续找到再补上。