React Native Android端启用TLS 1.1/1.2步骤及上架疑虑咨询
React Native低版本Android(API 16-19)TLS 1.1/1.2启用方案及Play Store上架疑虑解答
嗨,我之前在React Native项目里也遇到过一模一样的问题,针对低版本Android的TLS支持问题,我给你整理了一步一步的操作步骤,同时也帮你理清Play Store上架的顾虑~
一、具体实现步骤(无需深入Java知识)
你的项目minSdkVersion是16,对应Android 4.1及以上,而这些版本默认没开启TLS 1.1/1.2,我们只需要修改少量Android原生代码就能解决:
创建TLS配置类
打开你的RN项目中android/app/src/main/java/com/[你的项目包名]/目录(比如你的包名是com/myapp,就找到这个文件夹),新建一个名为TLSSocketFactory.java的Java文件,复制以下代码进去:import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import java.security.KeyStore; import java.security.KeyStoreException; public class TLSSocketFactory extends SSLSocketFactory { private SSLSocketFactory internalSSLSocketFactory; public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, trustManagers, new SecureRandom()); internalSSLSocketFactory = context.getSocketFactory(); } @Override public String[] getDefaultCipherSuites() { return internalSSLSocketFactory.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { return internalSSLSocketFactory.getSupportedCipherSuites(); } @Override public Socket createSocket() throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); } @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); } private Socket enableTLSOnSocket(Socket socket) { if(socket != null && (socket instanceof SSLSocket)) { ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"}); } return socket; } }这个类会帮低版本系统启用TLS 1.1/1.2,同时沿用系统默认的证书信任机制,保证安全性,这也是Play Store上架的关键。
修改Application类
在同一个包目录下找到MainApplication.java文件,做两处修改:- 在文件顶部添加两个导入语句:
import android.os.Build; import javax.net.ssl.HttpsURLConnection; - 在
onCreate方法里添加启用TLS的逻辑(放在原有RN初始化代码之前,比如SoLoader.init之前):@Override public void onCreate() { super.onCreate(); // 仅针对Android 4.1-4.4(API 16-19)启用TLS 1.1/1.2 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH) { try { TLSSocketFactory socketFactory = new TLSSocketFactory(); HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory); } catch (Exception e) { e.printStackTrace(); } } // 保留你原有的React Native初始化代码 SoLoader.init(this, /* native exopackage */ false); // ...其他原有代码 }
- 在文件顶部添加两个导入语句:
测试验证
回到RN项目根目录,执行npx react-native run-android,在Android 4.1、4.4、5.1的设备或模拟器上测试,应该就能正常获取API数据了。
二、关于Play Store上架的疑虑
你看到的“启用后无法上架”的说法大概率是过时或者误解,现在完全可以正常上架,原因如下:
- Google Play政策支持:Google早在2018年就要求所有应用必须支持TLS 1.2,针对低版本系统通过代码启用TLS 1.2是符合政策要求的,甚至是推荐的做法,能提升低版本用户的安全性。
- 安全合规性:我们上面用的代码沿用了系统默认的证书信任机制,不会信任所有未知证书(有些错误的实现会用信任所有证书的代码,这才会被Play Store拒),完全符合安全规范。
- 低版本支持的合理性:只要你的
minSdkVersion设置符合要求(你现在是16),Google允许应用支持这些旧版本,启用TLS不会成为上架的障碍。
如果还有其他问题,随时留言~
内容的提问来源于stack exchange,提问作者Lil-Rav El Génio
相关产品推荐
相关产品推荐

