我正在制作一个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,那并没有真正的帮助。
答案 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问题。如果是,您可以尝试以下步骤:
创建一个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) {
}}
从MainApplication类中调用它:
public void onCreate() {
super.onCreate();
SSLCertificateHandler.trustSSL();}