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 .