在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更&#x597D;

这个答案适用于Android。

  1. node_modules\react-native\ReactAndroid\src\main\java\com\facebook\react\modules\network上findOkHttpClientProvider.java。

  2. 编译ReactAndroid使用NDK