如果SSL(https)证书无效,React Native的XMLHttpRequest请求会失败。

4

当我使用XMLHttpRequest连接非有效证书的https服务器时,React Native会抛出异常"The operation couldn’t be completed. (NSURLErrorDomain error -1202.)"。

是否有可能禁用React Native XMLHttpRequest的ssl警告/检查?


你是否考虑过使用 fetch 而不是 XHR? - Richard Kho
我正在链接的类似帖子已经被赞和收藏,所以我投票支持关闭这篇帖子。我在那里发布了一个回答,应该会有帮助! https://dev59.com/MFwY5IYBdhLWcg3wM1bK - m59
3个回答

8
免责声明:这种解决方案应该是暂时的,并且应该记录下来,以使它不会留在软件的生产阶段,仅适用于开发。
对于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,在其上单击左键并选择“作为源代码打开”。

最后只需添加:

<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>

要实现真正的生产就绪解决方案,https://dev59.com/MFwY5IYBdhLWcg3wM1bK#36368360这个方案更好。


1
是否有针对上述问题的 Android 等效解决方案? - Rishabh Maurya

1
由于iOS 9(以及8.4)中的新App Transport Security(ATS)功能,这种情况正在发生。ATS旨在确保您的应用程序符合安全连接的最佳实践。如果您遇到此错误,则意味着您未使用安全连接,您应该采取一些措施。

但是,您可以通过编辑应用程序的Info.plist文件来覆盖默认行为。

有许多不同的标志可以设置,它们都在{{link1:苹果官方技术说明}}中进行了描述。

最简单的修改方法是完全关闭ATS,如下所示:

  1. 在Xcode中打开您的项目
  2. 在左侧列出您的项目所有文件的位置上搜索Info.plist
  3. 右键单击该文件,选择Open as > Source Code
  4. 在第一个<dict>标记下面添加以下代码

如果您计划发布应用程序,请不要留下此处。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

0
据我所知,Web XHR 也无法实现此功能,因此 React Native 不会公开此功能。我已经检查了源代码,这似乎证实了这一点。

你可以在浏览器中添加异常,但在RN中无法这样做。 - Artyom Trityak
那么有没有不需要忽略错误的解决方案?Fetch API支持TLS 1.2吗? - aintnorest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接