我正在制作一个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问题。如果我是真的,你可以尝试以下步骤:
-
创建一个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) { }}
-
从主应用程序类调用:
public void onCreate() { super.onCreate(); SSLCertificateHandler.trustSSL();}