React Native 0.66.4 fetch调用自签HTTPS接口报网络错误如何解决
问题根因
NSAllowsArbitraryLoads 仅用于放开iOS ATS策略对HTTP明文请求的限制,完全不涉及SSL证书合法性校验逻辑。你遇到的报错本质是自签名证书不在系统内置的受信根证书列表中,iOS/安卓原生网络层在TLS握手阶段直接拦截了不受信证书的请求,和ATS配置是否开启没有关系,所以单独配置Info.plist无法解决问题。
分平台解决方案
iOS端(针对RN 0.66.4版本验证有效)
- 首先修正Info.plist中的ATS配置,不要只开全局任意加载,需要针对你访问的局域网IP添加单独的例外规则,配置示例如下:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <!-- 替换为你实际调用的API服务端局域网IP --> <key>192.168.1.100</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
- 补充NSURLSession证书信任回调,允许自签证书通过校验。打开
ios/[你的项目名]/AppDelegate.m文件,在@implementation AppDelegate块内、didFinishLaunchingWithOptions方法外添加如下代码:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
- 配置完成后进入ios目录执行
pod install,重新编译运行项目即可。
安卓端
- 首先在
android/app/src/main/AndroidManifest.xml的<application>标签中添加android:usesCleartextTraffic="true",放开明文请求限制。 - 新建自定义信任管理器类,路径为
android/app/src/main/java/[你的项目包名]/TrustAllCerts.java,代码如下:
import java.security.cert.CertificateException; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class TrustAllCerts implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }
- 修改同目录下的
MainApplication.java,覆盖RN默认的OkHttp客户端配置,注入自定义信任管理器跳过证书校验,重新编译打包即可生效。
快速调试方案(仅本地联调用)
如果不想修改原生代码,可以在JS层通过axios配置跳过证书校验,注意该方案无法通过App Store审核,仅适合开发阶段使用:
import axios from 'axios'; import https from 'https'; const httpsAgent = new https.Agent({ rejectUnauthorized: false // 关闭证书校验 }); // 发起请求时传入agent const res = await axios.get('https://192.168.1.100/api/test', { httpsAgent });
生产环境注意事项
- 上述全量跳过证书校验的逻辑绝对不能带到生产环境,否则会存在严重的中间人攻击安全风险。
- 生产环境如果需要访问局域网自签证书接口,建议将服务端自签根证书内置到App安装包中,实现SSL Pinning(证书绑定),仅信任指定的自签证书即可。
内容的提问来源于stack exchange,提问作者Gabriel P.
相关产品推荐
相关产品推荐

