近期开发安卓程序时,遇到一个问题,当终端的时间是过去的一个时间,在OKhttp请求时报异常,异常信息如下:javax.net.ssl.SSLHandshakeException:com.android.org.bouncycastle.jce.exception.ExtcertPathValidatorException:Could not validate.certificate:null
解决办法如下:
OkHttpClient okHttpClient =new OkHttpClient.Builder().
//很重要,这句话,增加这句话,下面这两句话
hostnameVerifier((hostname, session) -> true).
sslSocketFactory(createSSLSocketFactory()).
build();
SSL验证方法如下
@SuppressLint("TrulyRandom")
public static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory sSLSocketFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllManager()},
new SecureRandom());
sSLSocketFactory = sc.getSocketFactory();
} catch (Exception ignored) {
}
return sSLSocketFactory;
}
public static class TrustAllManager implements X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
public static class TrustAllHostnameVerifier implements HostnameVerifier {
@SuppressLint("BadHostnameVerifier")
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}