【问题标题】:Enable TLS 1.1/1.2 for Android 4.X in React Native在 React Native 中为 Android 4.X 启用 TLS 1.1/1.2
【发布时间】:2019-04-12 19:25:33
【问题描述】:

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

即使说了这么多,我还是无法理解,我想知道的是:

  • 是否有可能以任何方式分叉 React Native 来解决这个问题?

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

【问题讨论】:

    标签: android react-native ssl


    【解决方案1】:

    经过多次尝试解决它,只有一种方法对我有用。本质上,您需要从 Google 添加一个 Java 安全包,以在旧 Android 版本 (

    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);
    
    //...
    } 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • react-native 没有在后台使用 HttpsURLConnection,它使用了 okhttp3 库,我不认为你的回答是有效的。
      • 为什么okhttp3不使用HttpsURLConnection ?我将okhttp3 用于我的Android 项目和以上代码以绕过SSL/TLS 问题。
      猜你喜欢
      • 2019-06-04
      • 2019-04-29
      • 2020-02-15
      • 1970-01-01
      • 2018-02-03
      • 2016-08-25
      • 1970-01-01
      • 2016-09-16
      • 2016-04-27
      相关资源
      最近更新 更多