React-native использует OkHttp для разрешения запросов к объекту fetch
браузера и по умолчанию отклоняет подключения по самозаверяющим / недействительным сертификатам.
В этом сценарии мне необходимо реализовать возможность переключения между доверием всех сертификатов и поведением по умолчанию, которое выбирают пользователи во время выполнения. Это было достигнуто путем переопределения OkHttpClientFactory
по умолчанию и реализации вашей логики в TrustManager
, который вы используете для обхода / ограничения недействительных сертификатов.
Вот интерфейс TrustManager, который использовался для переопределения логики проверки сертификатов SSL.
public interface X509TrustManager extends TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException;
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException;
public X509Certificate[] getAcceptedIssuers();
}
Таким образом, в основном каждый раз, когда отправляется запрос, вызывается checkServerTrusted
, и когда метод не выдает CertificateException
, запрос проходит. Проблема, с которой я столкнулся, состоит в том, что после успешного запроса к серверу с поддержкой SSL ( https : //example.org) OkHttp отказывается вызывать метод checkServerTrusted
в течение пары секунд (4 , 5 секунд по умолчанию). Я предполагаю, что есть какой-то кэш, который поддерживает соединения TLS в течение нескольких секунд. Следовательно, приложение не может переключаться между этими двумя режимами, если вы не подождете несколько секунд, прежде чем сможете эффективно отключить опцию TrustAllCerts.
То, что я пытался сделать недействительными эти предполагаемые живые соединения, это следующие методы каждый раз, когда мы переключаемся между двумя режимами:
OkHttpClient client = OkHttpClientProvider.getOkHttpClient();
client.dispatcher().executorService().shutdown();
client.connectionPool().evictAll();
client.cache().close();
но у меня нет никаких признаков того, что какой-либо из вышеперечисленных методов эффективен.
Также я попытался настроить OkHttpClientFactory
после инициализации пользовательского OkHttpClient
, предполагая, что это может быть результатом connectTimeout или connectTimeout . Все еще не повезло.
return new OkHttpClient
.Builder()
/* ... */
.cookieJar(new ReactCookieJarContainer())
.connectTimeout(0, TimeUnit.MILLISECONDS)
.retryOnConnectionFailure(false)
.build();
Плюс, я проверил LOGCAT на Android и, по-видимому, используется кэшированная версия запроса. Так что, возможно, проблема уходит в прошлое, когда OkHttp стал активным.
Есть идеи?