前言
公司的后台公网之前的ca认证过期了,然后发现app中部分图片加载不出来
然后对于数据来源进行分析,发现展示不出来的是https的图片
网络框架使用的是鸿洋的OkhttpUtils 2.6.3版本,进行了二次封装
图片框架使用的是Glide
OkhttpUtils有对于https证书的设置讲解
这里主要提供下自己遇到的情况下的解决方案
这里的解决方案适用于自定义证书和信任所有证书
过程
网上有Glide加载Https图片的方案
大家可以随便搜索
大概的意思就是添加一个GlideModule来进行网络请求库的定制
需要添加GlideModule的依赖
我们也添加一下
compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
然后需要在application中进行初始化
//让Glide能用HTTPS
Glide.get(this).register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(RetrofitUtils.getOkHttpClient()));
我们可以发现RetrofitUtils.getOkHttpClient()是我们所没有的
大概的意思就是需要一个网络加载框架cilent来进行代理Glide的网络加载部分
再来看下鸿洋的OkhttpUtils 2.6.3版本源码
public class OkHttpClient implements Cloneable, Call.Factory {
可以发现,其集成了Call.Factory接口
这正是配置Glide时需要的
public Factory(Call.Factory client) {
直接将设置好的OkhttpUtils的Cilent填充进来
Glide
.get(this)
.register(GlideUrl.class,
InputStream.class,
new OkHttpUrlLoader.Factory(OkHttpUtils.getInstance().getOkHttpClient()));
最后 我们再在之前自己的框架中设置添加证书或者 https信任
.sslSocketFactory(createSSLSocketFactory())
.hostnameVerifier(new TrustAllHostnameVerifier())
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
private static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
private static class TrustAllCerts 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];
}
}
我这里是信任所有证书,对于添加证书的例子,百度就可以找到了
只是把设置证书的地方替换了就可以了