ReactNative自定义Android的SSL证书链校验_第1页
ReactNative自定义Android的SSL证书链校验_第2页
ReactNative自定义Android的SSL证书链校验_第3页
ReactNative自定义Android的SSL证书链校验_第4页
ReactNative自定义Android的SSL证书链校验_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第ReactNative自定义Android的SSL证书链校验目录前言HTTPS请求WebSocket

前言

虽然这次分享的内容解决了本人的实际开发需求,但由于不是专职的Android开发工程师,涉及到的Android相关内容可能会存在错误或者写法不合理,仅供参考,请多多指教。

本文示例基于:

ReactNative-0.67.3

Android-10+

不包括iOS

由于业务原因,需要在生产环境里面使用自签发证书,那自然这个证书是无法通过Android证书链验证的,为此需要自定义校验规则。

本文分为两部分,介绍了对HTTPS请求和WebSocket的处理,为方便展示,示例里面所采取的是不进行任何判断,直接返回true,相当于直接绕过检验,请各位根据项目自身需求,自定义相关的校验规则。

关于本文中频繁提到的源码编译,这里也有不少心得,目前正在整理中,将在不久之后更新。

HTTPS请求

在搜索引擎上,有一些解决方案是修改ReactNative源码里面的/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java,然后进行源码编译。

实际上其实是不需要进行源码编译这么麻烦的,在NetworkingModule.java同目录的OkHttpClientProvider.java中,能看到ReactNative本身是支持传入自定义的OkHttpClientFactory去创建NetworkingModule中的Client。

所以只需要以下几步:

在当前ReactNative项目中实现一个的OkHttpClientFactory,用来自定义证书链校验规则,文件可以放在MainActivity.java同级的目录里面。

//android/app/src/main/java/xxx(具体项目)/IgnoreSSLFactory.java

packagexxx;//具体项目

importwork.OkHttpClientFactory;

importwork.OkHttpClientProvider;

importwork.ReactCookieJarContainer;

publicclassIgnoreSSLFactoryimplementsOkHttpClientFactory{

privatestaticfinalStringTAG="IgnoreSSLFactory";

@Override

publicOkHttpClientcreateNewNetworkModuleClient(){

try{

@SuppressLint("CustomX509TrustManager")finalTrustManager[]trustAllCerts=newTrustManager[]{

newX509TrustManager(){

@SuppressLint("TrustAllX509TrustManager")

@Override

publicvoidcheckClientTrusted(java.security.cert.X509Certificate[]chain,StringauthType)throwsCertificateException{}

@SuppressLint("TrustAllX509TrustManager")

@Override

publicvoidcheckServerTrusted(java.security.cert.X509Certificate[]chain,StringauthType)throwsCertificateException{}

@Override

publicjava.security.cert.X509Certificate[]getAcceptedIssuers(){

returnnewjava.security.cert.X509Certificate[0];

finalSSLContextsslContext=SSLContext.getInstance("SSL");

sslContext.init(null,trustAllCerts,newjava.security.SecureRandom());

finalSSLSocketFactorysslSocketFactory=sslContext.getSocketFactory();

OkHttpClient.Builderbuilder=newOkHttpClient.Builder()

.connectTimeout(0,TimeUnit.MILLISECONDS).readTimeout(0,TimeUnit.MILLISECONDS)

.writeTimeout(0,TimeUnit.MILLISECONDS).cookieJar(newReactCookieJarContainer());

builder.sslSocketFactory(sslSocketFactory,(X509TrustManager)trustAllCerts[0]);

builder.hostnameVerifier((hostname,session)-true);//这里添加自定义相关的校验规则

returnbuilder.build();

}catch(Exceptione){

Log.e(TAG,e.getMessage());

thrownewRuntimeException(e);

在当前ReactNative项目中MainActivity.java里面import上文中提到的OkHttpClientProvider,在项目onCreate的时候,通过OkHttpClientProvider.setOkHttpClientFactory方法传入上一步中定义的OkHttpClientFactory

//android/app/src/main/java/xxx(具体项目)/MainActivity.java

importwork.OkHttpClientProvider;

publicclassMainActivityextendsReactActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

OkHttpClientProvider.setOkHttpClientFactory(newIgnoreSSLFactory());//增加这行代码

以上就能达到在ReactNaitve中自定义HTTPS请求证书链校验的目的。

WebSocket

由于没有在相关代码中找到类似OkHttpClientProvider.java中的setOkHttpClientFactory方法,所以我选择了通过源码编译去实现。思路和上文中提到的处理HTTPS请求类似:

修改ReactNative源码里面的/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java,定义一个自定义证书链校验规则的OkHttpClient.Builder用来替换原本代码中的OkHttpClient.Builder,

将原本代码里面的

替换成

//ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java`

//定义一个OkHttpClient

privateOkHttpClientIgnoreSSL(){

OkHttpClient.Builderbuilder=null;

try{

@SuppressLint("CustomX509TrustManager")finalTrustManager[]trustAllCerts=newTrustManager[]{

newX509TrustManager(){

@SuppressLint("TrustAllX509TrustManager")

@Override

publicvoidcheckClientTrusted(java.security.cert.X509Certificate[]chain,StringauthType)throwsCertificateException{

@SuppressLint("TrustAllX509TrustManager")

@Override

publicvoidcheckServerTrusted(java.security.cert.X509Certificate[]chain,StringauthType)throwsCertificateException{

@Override

publicjava.security.cert.X509Certificate[]getAcceptedIssuers(){

returnnewjava.security.cert.X509Certificate[0];

finalSSLContextsslContext=SSLContext.getInstance("SSL");

sslContext.init(null,trustAllCerts,newjava.security.SecureRandom());

finalSSLSocketFactorysslSocketFactory=sslContext.getSocketFactory();

builder=newOkHttpClient.Builder()

.connectTimeout(10,TimeUnit.SECONDS)

.writeTimeout(10,TimeUnit.SECONDS)

.readTimeout(0,TimeUnit.MINUTES);//Disabletimeoutsforread

builder.sslSocketFactory(sslSocketFactory,(X509TrustManager)trustAllCerts[0]);

builder.hostnameVerifier((hostname,session)-true);//这里添加自定义相关的校验规则

}catch(Exceptione){

Log.e(TAG,e.getMessage());

thrownewRuntimeException(e);

returnbuilder.build();

@Override

publicvoidconnect(

//OkHttpClientclient=

//newOkHttpClient.Builder()

//.connectTimeout(10,TimeUnit.SECONDS)

//.writeTimeout(10,TimeUnit.SECONDS)

//.readTimeout(0,TimeUnit.MINUTES)//Disabletimeoutsforread

//.build();

OkHttpClientclient=IgnoreSSL();//client替换成上面自定义的OkHttpClient,其余代码无需修改

进行源码编译,生成相关的aar文件。

以上就能达到在R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论