版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 从书中学会的成长心得分享(9篇)
- 电子商务平台运营方案优化策略工具
- 跨文化沟通与合作框架工具
- 企业信息数据化管理工具
- 河南省平顶山汝州市重点达标名校2026年初三下学期5月模拟考试语文试题含解析
- 四川省遂宁中学2026届初三第二学期月考英语试题试卷含解析
- 浙江省宁波镇海区六校联考2026届初三4月质量检查生物试题含解析
- 吉林省农安县新阳中学2025-2026学年初三5月检测试题语文试题含解析
- 资源开发合作契约承诺函(4篇)
- 2026年湖南省怀化市初三4月模拟考试(一模)语文试题含解析
- 2026年滁州职业技术学院单招综合素质考试题库附答案详解
- 2026春统编版三年级下册道德与法治每课知识点清单
- 分岗设权内部控制制度
- 2025年建筑安全员c2考试题及答案
- 2026年全国体育单招考试时事政治(2025.6-2026.1)-2026届中职高考
- 2025中国国新控股有限责任公司招聘7人笔试历年常考点试题专练附带答案详解
- 降低呼吸机管路积水发生率QCC
- 留样观察记录表
- 崔允漷建构新教学心得体会(共13篇)
- DB32∕T 1553-2009 江苏省高速公路工程工程量清单计价规范
- 输血相容性检测室内质控-课件
评论
0/150
提交评论