okhttpclient.setsslsocketfactory 报错解决
2024-01-09 16:30:08
以前一直都用HttpUrlConnection这个类来做通信和进行文件下载,apk更新升级等。
后续因为更新apk的时候包体积较大,网络不好的时候,用HttpUrlConnection偶尔会下载失败,于是下载更新apk就改为了okhtt3这个库,其他业务请求还是用HttpUrlConnection这个类。
至于用什么版本的okhttp3进行通信其实请求代码差别不大,比如我用的是
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
后续因为业务改动,服务端改为了https,所有的网络请求都用https方式了,
HttpUrlConnection改为https也是需要提供
SSLSocketFactory 和 X509TrustManager ,代码见下:
try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}};
SSLContext sc = SSLContext.getInstance("TLS");
//trustAllCerts信任所有的证书
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//boolean verify = HttpsURLConnection.getDefaultHostnameVerifier().verify("你的域名", session);
//return verify;
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
?给HttpUrlConnection设置SSLSocketFactory和HostnameVerifier即可进行https通信。
?这样修改后,HttpUrlConnection就可以请求https了,当然这里是信任所有https,实际上如果要真的验证还是需要拿到证书文件,进行实际验证的,此处略,只是暂时为了让通信能成功。
那么okhttp3的修改也是类似的,需要提供SSLSocketFactory和TrustManager,就拿上面的okhttp3的3.10.0版本进行改动,见下:
private SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
MyTrustManager mMyTrustManager = new MyTrustManager();
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{mMyTrustManager}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssfFactory;
}
//实现X509TrustManager接口
private static class MyTrustManager implements 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];
}
}
private static class TrustAllHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) { return true; }
}
在OkHttpClient请求的时候,增加两行代码即可:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(), new MyTrustManager())
.hostnameVerifier(new TrustAllHostnameVerifier())
.build();
然后用OkHttpClient去请求即可。
其中
.sslSocketFactory(createSSLSocketFactory(), new MyTrustManager()) .hostnameVerifier(new TrustAllHostnameVerifier())
?这两行是这里增加的,以前没有,现在为了支持https,需要增加这两行。
这样okhttp也就可以下载https的文件了,也可以更新apk文件了。
文章来源:https://blog.csdn.net/bawang_cn/article/details/135481400
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!