android - 如何在 Glide 中结合自签名 SSL 证书和 alltrusted context

标签 android ssl retrofit2 okhttp android-glide

https 后面有一个服务器,它使用自签名证书提供资源。我正在使用 okhttp/retrofit 和握手成功,所以任何资源都成功获得。但是,一旦我请求具有相同 Glide 的图像,但来自不同的服务器,该服务器也使用 https 加密,但已经使用不同的证书,我在逻辑上得到“java.security.cert.CertPathValidatorException:信任 anchor 找不到证书路径。”。不幸的是,我无法为每台服务器添加证书,我将获得的链接是动态的。
由于 SO 和 Google Docs 上有很多帖子,在我的 InetHelper 类中编写了两个函数,它们创建了两个不同的 OkHTTPClients - 一个带有自签名证书,另一个用于“AllTrusted”,例如:

            OkHttpClient.Builder builder = getSSLOKHttpBuilder();
            okClient = builder.build();

            OkHttpClient.Builder builderFree = getAllTrustedSSLOKHttpBuilder();
            okAllTrustedClient = builderFree.build(); 
现在,我们只能在 Glide 中使用 okAllTrustedClient,在 okHttp 集成中使用 Glide,但是我们必须使用 AllTrustedClient 顺便初始化 Glide 客户端:
@GlideModule
public final class OkHttpGlideModule extends LibraryGlideModule {

    private static OkHttpClient okGlideClient = InetHelper.getAllTrustedClient();

    public static void setOkClient(OkHttpClient client) {
        okGlideClient = client;
    }

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {

        super.registerComponents(context, glide, registry);
        registry.replace(GlideUrl.class, InputStream.class,
                new OkHttpUrlLoader.Factory(okGlideClient));
    }
}
但随后它将应用于通过 Glide 收到的所有资源。并且根据链接按需使用上面代码中的 setOkClient 函数来切换 OkHttpClient 客户端不起作用,显然是由于 Glide 被初始化一次。我想通过 Glide 仅将 AllTrusted 用于没有注册证书的链接。在这种情况下,最好的方法是什么?
预先感谢您的任何帮助!

最佳答案

经过几个小时的谷歌搜索和bumptech docs/examples阅读,我发现我的错误 - 只需更改继承的类和客户端引用:

@GlideModule
public final class OkHttpGlideModule extends LibraryGlideModule
@GlideModule
public final class OkHttpGlideModule extends AppGlideModule

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {
        OkHttpClient okGlideClient = InetHelper.getAllTrustedClient();
        registry.replace(GlideUrl.class, InputStream.class,
                new OkHttpUrlLoader.Factory(okGlideClient));
    }
现在它可以工作了,但是您不能在之前覆盖的 okHttp 客户端之间轻松切换(在我的情况下 setOkClient 方法不起作用)。如果有人得到它“为什么?”,请在评论中解释。谢谢。
希望它会有人帮助。

关于android - 如何在 Glide 中结合自签名 SSL 证书和 alltrusted context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63011344/

相关文章:

c# - WCF 客户端不忽略证书错误(但可以运行 Fiddler)

python - 通过 torchvision 下载 pytorch 数据集时出现 SSLCertVerificationError

android - 无法使用 Retrofit 2 检索的对象在 MutableLiveData 中设置值

android - 如何使用 swagger 从 wp rest api 生成 Retrofit 客户端库

android - 优化掉的 GLSL 属性

android WebView 通过耳机或蓝牙播放音频

java - 由于 SSLException 无法连接到 SQLServer

java - 使用 Protobuf( Protocol Buffer )通过 Retrofit 进行 GET 和 POST 服务调用

java - Mavericks 上的 Eclipse 错误 : posix_spawn is not a supported process launch mechanism on this platform

不会在 Activity 之间重新加载的 Android 导航栏