Как совместить Self-signed SSL certificate и alltrusted context

Прошу помочь. Есть сервер за https который отдает ресурсы по selft-signed сертификату, с помощью okhttp и retrofit handshake успешно проходит, любые ресурсы успешно получаются. Но как только я делаю запрос какого-нибудь изображения тем же Glide'ом, но с другого сервера, который также зашифрован https, но уже ДРУГИМ сертификатом, логично получаю "java.security.cert.CertPathValidatorException: Trust anchor for certification path not found." Добавлять сертификаты на каждый сервер нет возможности, ссылки приходят динамически.

Написал две функции, которые создают OkHTTPClient - один с самоподписанным сертификатом, другая для "AllTrusted", типа:

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

            OkHttpClient.Builder builderFree = getAllTrustedSSLOKHttpBuilder();
            okAllTrustedClient = builderFree.build(); 

теперь можно okAllTrustedClient клиент использовать только в 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 инициализируется единожды. Хочется использовать AllTrusted только для ссылок, которые не имеют зарегистрированных сертификатов. Как лучше поступить в этом случае? Заранее спасибо.


Ответы (1 шт):

Автор решения: vlketzer

В итоге, чтобы все заработало, нужно изменить наследуемый класс:

@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));
    }

теперь все работает, но переключаться между экземплярами okhttpclient , которые могут быть определены заранее вами (метод setOkClient в моем случае), не выходит. Елсли кто-то прокомментирует почему, буду благодарен.

Буду рад, если кому-то поможет.

→ Ссылка