前言
公司的後臺公網之前的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];
}
}
我這裏是信任所有證書,對於添加證書的例子,百度就可以找到了
只是把設置證書的地方替換了就可以了