在请求网络的时候如果使用https的话会出现下面的错误,找不到证书的路径信任锚点
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
这个错误也很好解决,最好的解决办法就是获取正规合法的https证书,让后台上传或者存在assets中,进行应用验证,这是最根本的解决办法!如果没有证书那只能忽略证书的校验了,下面是代码实现
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, new SecureRandom());
然后引用到OkHttpClient上面去
client.setSslSocketFactory(sc.getSocketFactory());
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
这样就忽略掉了正式的校验,看下整体请求的代码吧,这个是我写好的工具类,我只展示其中一段(get请求)大概明白咋添加就行了
public static void requestData(final String url, final HashMap<String, String> params, final RequestCallBack callBack) {
new Thread(new Runnable() {
@Override
public void run() {
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, new SecureRandom());
final String allUrl = url + builderParams(params);
Log.e("---------------------", allUrl);
Request request = new Request.Builder()
.url(allUrl)
.addHeader("Accept-Encoding", "musixmatch")
.build();
final OkHttpClient client = new OkHttpClient();
client.setSslSocketFactory(sc.getSocketFactory());
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
client.setConnectTimeout(30, TimeUnit.SECONDS);
client.setWriteTimeout(30, TimeUnit.SECONDS);
client.setReadTimeout(30, TimeUnit.SECONDS);
client.setRetryOnConnectionFailure(false);
client.setConnectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION_MS));
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
if (callBack != null)
callBack.onFailure(e);
}
@Override
public void onResponse(Response response) throws IOException {
if (callBack == null) return;
if (!response.isSuccessful()) {
callBack.onFailure(null);
} else {
callBack.onSuccess(response.body().string());
}
}
});
} catch (Exception e) {
if (callBack != null) callBack.onFailure(null);
}
}
}).start();
}