Признание недействительными установленных SSL-соединений в OkHttp и реактивных приложениях Android - PullRequest
0 голосов
/ 09 ноября 2018

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 стал активным.

Есть идеи?

...