异常详情:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
先前尝试解决:
尝试了网上几种方式,在Application里面加全局忽略校验的,都不行,还是会报这个证书错误,可能对于别的网络框架有用,但是对于AsyncHttp没用。
前言
因为服务器证书到期,运维更新了证书,结果出现了上述问题。
问题原因:
由于项目的https.bks证书不是正规的CA签发的证书,而是二级代理商等签发的证书,验证不通过造成的!
解决方案
通过排查项目代码,发现之前没有做证书信赖验证。这里先提供一个能解决问题但是不是最佳做法的方案,方便大家快速处理问题。
项目使用了android-async-http
通过对async-http的AsyncHttpClient 忽略https的证书校验(其实并不推荐,这样就失去了https的安全特性了)
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.addHeader("Accept-Language", LocaleUtils.getLanguage());
asyncHttpClient.addHeader("Accept-Encoding", "gzip");
asyncHttpClient.setTimeout(TIME_OUT_MILLS);
asyncHttpClient.setMaxRetriesAndTimeout(RETRIES, RETRY_INTERVAL);
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] {trustManagers}, new SecureRandom());
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext);
asyncHttpClient.setSSLSocketFactory(sslSocketFactory);
} catch (Exception e) {
e.printStackTrace();
}
/**
* 信任管理器
*/
private static TrustManager trustManagers = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
最后结语:
这个方案并不推荐,只是临时解决了https证书校验不通过的问题。推荐解决方案:运维换正规的https证书