我正在构建一个小的ReactNative iOS应用程序。 在其中,我使用fetch API向我控制的服务器发出简单的get请求,该服务器具有有效但自签名的SSL证书。可以理解的是,这会引起错误。
在iOS/JSC之间,我不确定如何(或者说哪些配置)可以使我的应用程序忽略此错误 - 到目前为止,我找到的所有答案都与Objective-C解决方案有关,我正在寻找一些我可以在JSC环境中使用的东西。
我正在构建一个小的ReactNative iOS应用程序。 在其中,我使用fetch API向我控制的服务器发出简单的get请求,该服务器具有有效但自签名的SSL证书。可以理解的是,这会引起错误。
在iOS/JSC之间,我不确定如何(或者说哪些配置)可以使我的应用程序忽略此错误 - 到目前为止,我找到的所有答案都与Objective-C解决方案有关,我正在寻找一些我可以在JSC环境中使用的东西。
我也遇到了同样的问题。正如你所说,似乎让自签名证书与本地iOS应用一起工作的唯一方法是编写/修改Objective-C代码,但对于使用React Native的JavaScript开发人员而言,这并不是一个好的方法。因此,我认为你的问题是一个X/Y问题,我建议从根本上解决你的问题,而不是首先使用自签名证书。
我使用真实证书进行开发。以下是我为使我的本地开发API与SSL和React Native一起工作所做的事情。它是免费且简单的。
./letsencrypt-auto certonly --standalone -d dev.my-domain.com -d api.dev.my-domain.com
/etc/letsencrypt/live/dev.my-domain.com
下找到scp -r your_user@123.123.(...):/etc/letsencrypt/live/dev.my-domain.com ./
hosts
文件address=/dev.my-domain.com/192.168.(...)
的操作以获得整个网络(我建议这样做)此时,因为您正在使用实际的、可信的域名证书进行访问,所以您的API现在在开发中的浏览器和设备中将被信任!
免责声明:这个解决方案应该是暂时的并且需要记录,以便它不会停留在软件的生产阶段,这只适用于开发。
对于iOS,你只需要打开你的xcodeproject(在RN文件夹内),一旦打开,进入RCTNetwork.xcodeproj,在该项目中,导航到RCTHTTPRequestHandler.m
在那个文件中,你会看到一行像这样:
#pragma mark - NSURLSession delegate
在那一行的下面,添加这个函数
#if DEBUG
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
#endif
现在你可以不使用有效证书就对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 那个解决方案更好。
react-native
请求的所有证书: https://gist.githubusercontent.com/aleclarson/2bd4347a54d08d2abcbb96ebbb573070/raw/956cf3e2d7cd1ce1d0cb93671db5bb10496feb39/ssl-dev.patch - aleclarson这个答案适用于Android。
在 node_modules\react-native\ReactAndroid\src\main\java\com\facebook\react\modules\network
找到 OkHttpClientProvider.java 文件。
使用 NDK 编译 ReactAndroid。
git pull
就可以在本地使用了。 - m59