在ReactNative应用程序中忽略使用获取API的自签名SSL证书的错误?
我正在构build一个小的ReactNative iOS应用程序。 其中,我使用获取API来向我拥有有效但自签名的SSL证书的服务器发出一个简单的获取请求。 可以理解的是,这会导致错误。
在iOS / JSC之间,我不确定如何(或什么!)我可以configuration为我的应用程序忽略这个错误 – 迄今为止我发现的所有答案都与Objective-C解决scheme有关,我正在寻找一些东西可以使用JSC环境。
我遇到了同样的问题。 正如您所指出的,似乎让本机iOS应用程序使用自签名证书的唯一方法是编写/修改Objective-C代码,这对于使用React Native的JavaScript开发人员来说不是一个好方法。 出于这个原因,我认为你的问题是一个X / Y问题 ,我build议用不同的方法解决你的整体问题,首先使用自签名证书。
我用一个真正的证书代替开发。 这是我做了什么来让我的本地开发API与SSL和React Native一起工作。 这是免费的,简单的。
- ssh到您的公共服务器,您的域名与之相关联
- 安装letsencrypt
- 为您的开发子域生成一个证书
- dev.my-domain.com在本地开发我的网站/ webapp
- api的api.dev.my-domain.com
./letsencrypt-auto certonly --standalone -d dev.my-domain.com -d api.dev.my-domain.com
- 将fullchain.pem和privkey.pem复制到本地机器
- 可能在
/etc/letsencrypt/live/dev.my-domain.com
下/etc/letsencrypt/live/dev.my-domain.com
- 从远程机器获取文件的一种方式:
scp -r your_user@123.123.(...):/etc/letsencrypt/live/dev.my-domain.com ./
- 可能在
- 用fullchain.pem和privkey.pemreplace您的自签名证书
- 点dev.your-domain.com和其他你使用开发机器的ip的子域名
- 你可以修改你想要使用域的每台机器上的
hosts
文件 - 如果你的路由器有dnsmasq,你可以为整个networking做一些
address=/dev.my-domain.com/192.168.(...)
(我推荐这个)
- 你可以修改你想要使用域的每台机器上的
在这一点上,因为您正在访问的域名使用的是真实可信的证书,所以您的API将在浏览器和开发中的设备上得到信任!
免责声明:这个解决scheme应该是临时的,并且logging下来,以便它不会停留在软件的生产阶段,这只是为了开发。
对于iOS,您只需打开xcodeproject(在RN的iOS文件夹内),进入RCTNetwork.xcodeproj并在该项目中导航到RCTHTTPRequestHandler.m
在那个文件中你会看到这样的一行:
#pragma mark - NSURLSession delegate
在那行之后,添加这个函数
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
瞧,你现在可以在没有有效证书的情况下对你的API进行不安全的调用。
这应该够了,但如果你仍然有问题,你可能需要去你的项目的info.plist,左键单击它,并select打开为…源代码。
最后只是添加
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
所以你的文件看起来像这样
... <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> <key>NSLocationWhenInUseUsageDescription</key> <string></string> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> </dict> </plist>
对于真正的生产就绪解决scheme, https://stackoverflow.com/a/36368360/5943130该解决scheme更好
这个答案适用于Android。
-
在
node_modules\react-native\ReactAndroid\src\main\java\com\facebook\react\modules\network
上findOkHttpClientProvider.java。 -
编译ReactAndroid使用NDK
- UIImageView animationRepeatCount奇怪的行为
- 使应用程序显示为iOS 8的build议在锁屏应用程序
- UIStepper。 找出是增加还是减less
- 从匿名数据库中删除匿名用户
- Parse.com PFUser signUpInBackgroundWithBlock:块在第一次点击时不被调用
- iAd应用程序需要多长时间才能开始生成展示次数?
- GTLServiceYouTube未调用executeQuery回调
- 推送通知在Firebase 4.0中无效
- SocketRocket试图安装socketrocket后,我可以让PonyDebugger工作,我得到3个苹果Match-O链接器错误