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



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

  • 支持Android 4.x上的TLS 1.1和1.2
  • 支持在Android 4.1-4.4上启用TLSv1.2

即使有这么多话,我也无法理解,我想知道的是:

  • 是否可以在不使用分叉React Native的情况下以任何方式解决此问题

我认为这个提交似乎是一个可行的解决方案,但它确实侵入了React Native源代码,我希望将来不会有可能的冲突。我还看到你可以创建一个自定义的SSLSocketFactory,但我如何通过React Native使用该工厂来进行所有请求?我还听说,在某些情况下,您可能需要更新设备SSL版本,但如果我不能为我的请求调用TLS 1.1/1.2,这并没有真正的帮助。

经过多次尝试,只有一种方法对我有效。本质上,你需要添加谷歌的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);
//...
} 

据我所知,这是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. 从主应用程序类调用:

    public void onCreate() {
    super.onCreate();
    SSLCertificateHandler.trustSSL();}
    

最新更新