Перейти к основному содержимому

Доверие ко всем сертификатам в OkHttp

· 2 мин. чтения

1. Обзор

В этом руководстве мы увидим, как создать и настроить OkHttpClient , чтобы он доверял всем сертификатам .

Ознакомьтесь с нашими статьями о OkHttp, чтобы узнать больше о библиотеке.

2. Зависимость от Maven

Начнем с добавления зависимости OkHttp в наш файл pom.xml :

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.2</version>
</dependency>

3. Используйте обычный OkHttpClient

Для начала возьмем стандартный объект OkHttpClient и вызовем веб-страницу с просроченным сертификатом:

OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

Вывод трассировки стека будет выглядеть следующим образом:

sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed

Теперь давайте посмотрим на ошибку, полученную при попытке использовать другой веб-сайт с самозаверяющим сертификатом:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

И давайте попробуем веб-сайт с неверным сертификатом хоста:

Hostname wrong.host.badssl.com not verified

Как мы видим, по умолчанию OkHttpClient выдает ошибки, если вызывает сайты с плохими сертификатами . Итак, далее мы увидим, как создать и настроить OkHttpClient , чтобы он доверял всем сертификатам.

4. Настройте OkHttpClient так , чтобы он доверял всем сертификатам

Давайте создадим наш массив TrustManager , содержащий один X509TrustManager , который отключает проверки сертификатов по умолчанию, переопределяя их методы :

TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};

Мы будем использовать этот массив TrustManager для создания SSLContext :

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

Затем мы будем использовать этот SSLContext для установки SSLSocketFactory сборщика OkHttpClient :

OkHttpClient.Builder newBuilder = new OkHttpClient.Builder();
newBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]);
newBuilder.hostnameVerifier((hostname, session) -> true);

Мы также устанавливаем HostnameVerifier нового Builder в новый объект HostnameVerifier , метод проверки которого всегда возвращает true . ** ``**

Наконец, мы можем получить новый объект OkHttpClient и снова вызывать сайты с плохими сертификатами без ошибок:

OkHttpClient newClient = newBuilder.build();
newClient.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

5. Вывод

В этой короткой статье мы увидели, как создать и настроить OkHttpClient для доверия всем сертификатам . Конечно, доверять всем сертификатам не рекомендуется. Тем не менее, могут быть некоторые случаи, когда нам это понадобится.

Полный код для этой статьи доступен на GitHub .