Как совместить 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 шт):
В итоге, чтобы все заработало, нужно изменить наследуемый класс:
@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 в моем случае), не выходит. Елсли кто-то прокомментирует почему, буду благодарен.
Буду рад, если кому-то поможет.