在React Native中为Android 4.X启用TLS 1.1 / 1.2

时间:2018-11-09 08:22:57

标签: android react-native ssl

我正在制作一个minSdkVersion为16(Android 4.1)的React Native应用。它向服务器已禁用TLS 1.0的HTTPS页面发出请求。据我了解,Android 4.X具有TLS 1.1 / 1.2功能,但需要专门调用它们。我发现有几个人声称要解决此问题,但这些人似乎只是纯Java解决方案。例如:

即使说了这么多话,我也无法转过头来,奇怪的是:

  • 是否有可能以没有的任何方式解决此问题?

我看到this commit似乎是一个可行的解决方案,但是它确实入侵了React Native源代码,并且我希望将来不会在那里发生冲突。我还看到您可以create a custom SSLSocketFactory,但是我如何通过React Native发出的所有请求都使用该工厂?我还听说您在某些情况下可能必须update the device SSL version,但是如果我无法为我的请求调用TLS 1.1 / 1.2,那并没有真正的帮助。

2 个答案:

答案 0 :(得分:1)

在尝试解决许多问题之后,只有一种方法对我有效。本质上,您需要从Google添加Java安全软件包,以在旧Android版本(<5.0)上启用TLSv1 / TLSv1.1 / TLSv1.2。这还将增加对TLSv1.3的支持并增加apk大小,但我想我们必须忍受它。

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);

//...
} 

答案 1 :(得分:0)

据我了解,这是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();}