Skip to content

Commit 48e4b2b

Browse files
authored
Merge pull request #16 from lingokids/fix/tls-android
Fix TLS 1.2 support for Android 4.4.x devices
2 parents 87adbfe + 27ee656 commit 48e4b2b

File tree

2 files changed

+76
-15
lines changed

2 files changed

+76
-15
lines changed

android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.RNFetchBlob.Response.RNFetchBlobDefaultResp;
2020
import com.RNFetchBlob.Response.RNFetchBlobFileResp;
21+
import com.RNFetchBlob.Utils.Tls12SocketFactory;
2122
import com.facebook.common.logging.FLog;
2223
import com.facebook.react.bridge.Arguments;
2324
import com.facebook.react.bridge.Callback;
@@ -823,32 +824,23 @@ public void onReceive(Context context, Intent intent) {
823824
public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
824825
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
825826
try {
826-
// Code from https://stackoverflow.com/a/40874952/544779
827-
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
828-
trustManagerFactory.init((KeyStore) null);
829-
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
830-
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
831-
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
832-
}
833-
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
834-
SSLContext sslContext = SSLContext.getInstance("SSL");
835-
sslContext.init(null, new TrustManager[] { trustManager }, null);
836-
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
837-
838-
client.sslSocketFactory(sslSocketFactory, trustManager);
827+
// Code from https://github.com/square/okhttp/issues/2372#issuecomment-244807676
828+
SSLContext sc = SSLContext.getInstance("TLSv1.2");
829+
sc.init(null, null, null);
830+
client.sslSocketFactory(new Tls12SocketFactory(sc.getSocketFactory()));
839831

840832
ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
841833
.tlsVersions(TlsVersion.TLS_1_2)
842834
.build();
843835

844-
List< ConnectionSpec > specs = new ArrayList < > ();
836+
List<ConnectionSpec> specs = new ArrayList<>();
845837
specs.add(cs);
846838
specs.add(ConnectionSpec.COMPATIBLE_TLS);
847839
specs.add(ConnectionSpec.CLEARTEXT);
848840

849841
client.connectionSpecs(specs);
850842
} catch (Exception exc) {
851-
FLog.e("OkHttpClientProvider", "Error while enabling TLS 1.2", exc);
843+
FLog.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc);
852844
}
853845
}
854846

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.RNFetchBlob.Utils;
2+
3+
import java.io.IOException;
4+
import java.net.InetAddress;
5+
import java.net.Socket;
6+
import java.net.UnknownHostException;
7+
8+
import javax.net.ssl.SSLSocket;
9+
import javax.net.ssl.SSLSocketFactory;
10+
11+
/**
12+
* Enables TLS v1.2 when creating SSLSockets.
13+
* <p/>
14+
* For some reason, android supports TLS v1.2 from API 16, but enables it by
15+
* default only from API 20.
16+
* @link https://developer.android.com/reference/javax/net/ssl/SSLSocket.html
17+
* @see SSLSocketFactory
18+
*/
19+
public class Tls12SocketFactory extends SSLSocketFactory {
20+
private static final String[] TLS_V12_ONLY = {"TLSv1.2"};
21+
22+
final SSLSocketFactory delegate;
23+
24+
public Tls12SocketFactory(SSLSocketFactory base) {
25+
this.delegate = base;
26+
}
27+
28+
@Override
29+
public String[] getDefaultCipherSuites() {
30+
return delegate.getDefaultCipherSuites();
31+
}
32+
33+
@Override
34+
public String[] getSupportedCipherSuites() {
35+
return delegate.getSupportedCipherSuites();
36+
}
37+
38+
@Override
39+
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
40+
return patch(delegate.createSocket(s, host, port, autoClose));
41+
}
42+
43+
@Override
44+
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
45+
return patch(delegate.createSocket(host, port));
46+
}
47+
48+
@Override
49+
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
50+
return patch(delegate.createSocket(host, port, localHost, localPort));
51+
}
52+
53+
@Override
54+
public Socket createSocket(InetAddress host, int port) throws IOException {
55+
return patch(delegate.createSocket(host, port));
56+
}
57+
58+
@Override
59+
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
60+
return patch(delegate.createSocket(address, port, localAddress, localPort));
61+
}
62+
63+
private Socket patch(Socket s) {
64+
if (s instanceof SSLSocket) {
65+
((SSLSocket) s).setEnabledProtocols(TLS_V12_ONLY);
66+
}
67+
return s;
68+
}
69+
}

0 commit comments

Comments
 (0)