【问题标题】:React Native XMLHttpRequest request fails if ssl (https) certificate is not valid如果 ssl (https) 证书无效,则 React Native XMLHttpRequest 请求失败
【发布时间】:2015-09-23 19:39:19
【问题描述】:

当我使用无效证书对 https 服务器执行 XMLHttpRequest 时,React Native 抛出异常“操作无法完成。(NSURLErrorDomain 错误 -1202。)”

是否可以禁用 ssl 警告/检查 React Native XMLHttpRequest?

【问题讨论】:

标签: javascript ios react-native


【解决方案1】:

据我所知,您也不能在 web XHR 中执行此操作,因此 React Native 不会公开它。我检查了源代码,似乎证实了这一点。

【讨论】:

  • 您可以在浏览器中添加异常,但您不能在 RN 中执行此操作
  • 那么有没有不涉及忽略错误的解决方案? fetch api 支持 TLS 1.2 吗?
【解决方案2】:

这是因为 iOS 9(以及 8.4)中的新应用传输安全 (ATS) 功能。 ATS 已到位,可确保您的应用符合安全连接的最佳实践。如果您遇到此错误,则表示您没有使用安全连接,您应该对此采取措施。

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

您可以设置许多不同的标志,它们都在an Apple official technote 中进行了描述。

让您一起关闭 ATS 的最简单修改如下:

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

如果你打算发布你的应用,你真的真的不应该把它留在这里。

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

【讨论】:

    【解决方案3】:

    免责声明:此解决方案应该是临时的并记录在案,以便它不会停留在软件的生产阶段,这仅用于开发。

    对于 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://stackoverflow.com/a/36368360/5943130 该解决方案更好

    【讨论】:

    • 上述问题是否有安卓等效解决方案?
    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多