Включить TLS 1.1 / 1.2 для Android 4.X в React Native - PullRequest
0 голосов
/ 09 ноября 2018

Я нахожусь в процессе создания приложения React Native с minSdkVersion из 16 (Android 4.1). Это делает запросы к страницам HTTPS, где сервер отключил TLS 1.0. Насколько я понимаю, Android 4.X имеет возможности TLS 1.1 / 1.2, но их нужно вызывать специально. Я обнаружил, что некоторые люди утверждают, что это исправить, но они кажутся чистыми решениями Java. Например:

Даже несмотря на все эти разговоры, я не могу обернуть голову и удивляюсь:

  • Можно ли решить это каким-либо образом без разветвления React Native?

Я вижу этот коммит , который кажется возможным решением, но он вторгается в исходный код React Native, и я бы предпочел, чтобы в будущем не возникало возможных конфликтов. Я также вижу, что вы можете создать пользовательский SSLSocketFactory, но тогда как мне сделать, чтобы все запросы через React Native использовали эту фабрику? Я также слышал, что вам может потребоваться обновить версию SSL устройства в некоторых случаях, но это не очень помогает, если я не могу вызвать TLS 1.1 / 1.2 для своих запросов.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

После многочисленных попыток решить ее, у меня сработал только один способ. По сути, вам нужно добавить пакет безопасности Java от Google, чтобы включить TLSv1 / TLSv1.1 / TLSv1.2 в старых версиях Android (<5.0). Это также добавит поддержку TLSv1.3 и увеличит размер apk, но я думаю, нам придется с этим смириться. </p>

Добавить пакет в app/build.gradle:

implementation 'org.conscrypt:conscrypt-android:2.1.0'

Обновление MainApplication.java для использования нового поставщика безопасности:

@Override
public void onCreate() {
super.onCreate();

Security.insertProviderAt(new org.conscrypt.OpenSSLProvider(), 1);

//...
} 
0 голосов
/ 09 ноября 2018

Насколько я понимаю, это проблема SSL. Если я правда, вы можете попробовать следующие шаги:

  1. Создайте класс Java SSLCertificateHandler, чтобы включить SSL с функцией ниже:

    public static void trustSSL() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                X509Certificate[] myTrustedAnchors = new X509Certificate[0];
                return myTrustedAnchors;
            }
    
            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
    
            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        } };
    
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
    } catch (Exception e) {
    }}
    
  2. Вызовите его из класса MainApplication:

    public void onCreate() {
    super.onCreate();
    SSLCertificateHandler.trustSSL();}
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...