Glide - javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚

Lal*_*rma 8 ssl android android-glide

我将服务器迁移HTTP到了HTTPS我已经使用自签名证书发送网络请求HttpUrlConnection并且它工作但是对于图像加载它不起作用,因为我使用Glide进行图像加载.

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚.从https URL通过滑动库加载图像

Glide.with(mContext).load(currentItem.getImage_path().replace(" ", "%20"))
     .listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            genericViewHolder.imageView_1.setImageResource(R.drawable.image_thumbnail);
            genericViewHolder.progressBar.setVisibility(View.GONE);
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            genericViewHolder.progressBar.setVisibility(View.GONE);
            return false;
        }
    }).into(genericViewHolder.imageView_1);
Run Code Online (Sandbox Code Playgroud)

我尝试使用链接并使用GlideModule但它似乎不起作用.请帮忙.

sus*_*vi 7

问题是关于证书请点击此链接 - /sf/answers/2732270341/

这将绕过证书并允许您进入系统

也可以看到这个链接 - https://futurestud.io/tutorials/glide-module-example-accepting-self-signed-https-certificates

创建您的自定义GlideModule类,OkHttpUrlLoader类并附上Glide,如上所述

你必须把

<meta-data
        android:name="io.futurestud.tutorials.glide.glidemodule.CustomImageSizeGlideModule"
        android:value="GlideModule" />
Run Code Online (Sandbox Code Playgroud)

AndroidMainifiest文件的内部应用程序标记https://github.com/fs-opensource/android-tutorials-glide/blob/master/app/src/main/AndroidManifest.xml

  • 最后,https://futurestud.io/tutorials/glide-module-example-accepting-self-signed-https-certificates 有所帮助。感谢您的支持 (2认同)

Gow*_*K C 7

对于滑翔4

@GlideModule
public class MyGlideModule extends AppGlideModule {

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

        //To Attach Self Signed Ssl Certificate
        /*OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .sslSocketFactory(sslSocketFactory, X509TrustManager)
                .build();*/

        //Unsafe Okhttp client
        OkHttpClient okHttpClient= UnsafeHttpsClient.getUnsafeOkHttpClient();

        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您能否再解释一下您的答案? (5认同)
  • 这个答案并不能解决任何问题!我很惊讶人们对此表示赞同!解决方案中缺少名为“UnsafeHttpsClient”的完整自定义类。 (5认同)
  • 无法解析** OkHttpUrlLoader ** (3认同)
  • 我不明白为什么人们投票这种不完整的答案!UnsafeHttpsClient.getUnsafeOkHttpClient();解决方案中缺少整个类,根本没有解释,您只需复制粘贴的代码即可。 (2认同)
  • 无法解析 OkHttpUrlLoader =&gt; /sf/ask/2604563041/ (2认同)

小智 5

您可以使用我从“使用 okHttp 信任所有证书”的答案中复制的代码您可以使用我从“使用 okHttp \xe2\x80\x94

\n
\n

创建类 UnsafeOkHttpClient.java

\n
public class UnsafeOkHttpClient {\npublic static OkHttpClient getUnsafeOkHttpClient() {\n    try {\n        // Create a trust manager that does not validate certificate chains\n        final TrustManager[] trustAllCerts = new TrustManager[] {\n                new X509TrustManager() {\n                    @Override\n                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String\n
Run Code Online (Sandbox Code Playgroud)\n

authType) 抛出证书异常 {\n}

\n
                    @Override\n                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String\n
Run Code Online (Sandbox Code Playgroud)\n

authType) 抛出证书异常 {\n}

\n
                    @Override\n                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {\n                        return new java.security.cert.X509Certificate[]{};\n                    }\n                }\n        };\n\n        // Install the all-trusting trust manager\n        final SSLContext sslContext = SSLContext.getInstance("SSL");\n        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());\n\n        // Create an ssl socket factory with our all-trusting manager\n        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();\n\n        OkHttpClient.Builder builder = new OkHttpClient.Builder();\n        builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);\n        builder.hostnameVerifier(new HostnameVerifier() {\n            @Override\n            public boolean verify(String hostname, SSLSession session) {\n                return true;\n            }\n        });\n\n        OkHttpClient okHttpClient = builder.build();\n        return okHttpClient;\n    } catch (Exception e) {\n        throw new RuntimeException(e);\n    }\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个类 MyGlideModule.java

\n
@GlideModule\npublic class MyGlideModule extends AppGlideModule {\n@Override\npublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {\n    OkHttpClient okHttpClient= UnsafeOkHttpClient.getUnsafeOkHttpClient();\n    registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个类 OkHttpStreamFetcher.java

\n
public class OkHttpStreamFetcher implements DataFetcher<InputStream>, okhttp3.Callback {\nprivate static final String TAG = "OkHttpFetcher";\nprivate final Call.Factory client;\nprivate final GlideUrl url;\nprivate InputStream stream;\nprivate ResponseBody responseBody;\nprivate DataCallback<? super InputStream> callback;\nprivate volatile Call call;\n\n// Public API.\n@SuppressWarnings("WeakerAccess")\npublic OkHttpStreamFetcher(Call.Factory client, GlideUrl url) {\n    this.client = client;\n    this.url = url;\n}\n\n@Override\npublic void loadData(\n        @NonNull Priority priority, @NonNull final DataCallback<? super InputStream> callback) {\n    Request.Builder requestBuilder = new Request.Builder().url(url.toStringUrl());\n    for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {\n        String key = headerEntry.getKey();\n        requestBuilder.addHeader(key, headerEntry.getValue());\n    }\n    Request request = requestBuilder.build();\n    this.callback = callback;\n\n    call = client.newCall(request);\n    call.enqueue(this);\n}\n\n@Override\npublic void onFailure(@NonNull Call call, @NonNull IOException e) {\n    if (Log.isLoggable(TAG, Log.DEBUG)) {\n        Log.d(TAG, "OkHttp failed to obtain result", e);\n    }\n\n    callback.onLoadFailed(e);\n}\n\n@Override\npublic void onResponse(@NonNull Call call, @NonNull Response response) {\n    responseBody = response.body();\n    if (response.isSuccessful()) {\n        long contentLength = Preconditions.checkNotNull(responseBody).contentLength();\n        stream = ContentLengthInputStream.obtain(responseBody.byteStream(),\n
Run Code Online (Sandbox Code Playgroud)\n

contentLength);\ncallback.onDataReady(stream);\n} else {\ncallback.onLoadFailed(new HttpException(response.message(), response.code()));\n}\n}

\n
@Override\npublic void cleanup() {\n    try {\n        if (stream != null) {\n            stream.close();\n        }\n    } catch (IOException e) {\n        // Ignored\n    }\n    if (responseBody != null) {\n        responseBody.close();\n    }\n    callback = null;\n}\n\n@Override\npublic void cancel() {\n    Call local = call;\n    if (local != null) {\n        local.cancel();\n    }\n}\n\n@NonNull\n@Override\npublic Class<InputStream> getDataClass() {\n    return InputStream.class;\n}\n\n@NonNull\n@Override\npublic DataSource getDataSource() {\n    return DataSource.REMOTE;\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个类 OkHttpUrlLoader.java

\n
public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {\n\nprivate final Call.Factory client;\n\n// Public API.\n@SuppressWarnings("WeakerAccess")\npublic OkHttpUrlLoader(@NonNull Call.Factory client) {\n    this.client = client;\n}\n\n@Override\npublic boolean handles(@NonNull GlideUrl url) {\n    return true;\n}\n\n@Override\npublic LoadData<InputStream> buildLoadData(\n        @NonNull GlideUrl model, int width, int height, @NonNull Options options) {\n    return new LoadData<>(model, new OkHttpStreamFetcher(client, model));\n}\n\npublic static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {\n    private static volatile Call.Factory internalClient;\n    private final Call.Factory client;\n\n    private static Call.Factory getInternalClient() {\n        if (internalClient == null) {\n            synchronized (Factory.class) {\n                if (internalClient == null) {\n                    internalClient = new OkHttpClient();\n                }\n            }\n        }\n        return internalClient;\n    }\n\n    public Factory() {\n        this(getInternalClient());\n    }\n\n    public Factory(@NonNull Call.Factory client) {\n        this.client = client;\n    }\n\n    @NonNull\n    @Override\n    public ModelLoader<GlideUrl, InputStream> build(MultiModelLoaderFactory multiFactory) {\n        return new OkHttpUrlLoader(client);\n    }\n\n    @Override\n    public void teardown() {\n        // Do nothing, this instance doesn\'t own the client.\n    }\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

添加应用程序/build.gradle

\n
implementation \'com.github.bumptech.glide:glide:4.10.0\'\nannotationProcessor \'com.github.bumptech.glide:compiler:4.10.0\'\nimplementation("com.github.bumptech.glide:okhttp3-integration:4.2.0")\n
Run Code Online (Sandbox Code Playgroud)\n

{\n排除组:\'glide-parent\'\n}

\n

在AndroidManifest.xml中

\n
<application>\n<meta-data\n        android:name="Replace_your_package_name.UnsafeOkHttpClient"\n        android:value="MyGlideModule" />\n</application>\n
Run Code Online (Sandbox Code Playgroud)\n
\n