无法从JavaScript端连接树莓派4:Fetch请求网络错误问题
问题分析与解决方案
核心问题是Python脚本通过verify=False跳过了SSL证书验证,而JavaScript的Fetch/Axios默认会严格校验HTTPS证书的合法性,导致请求失败。以下分不同环境给出针对性解决办法:
1. React Native 环境
临时测试方案(不推荐生产)
- iOS:修改
Info.plist,添加以下配置允许对指定域名跳过证书验证:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>10.42.0.1</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> </dict> </dict> </dict>
- Android:修改
AndroidManifest.xml,在<application>标签内添加android:networkSecurityConfig="@xml/network_security_config",然后在res/xml目录创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">10.42.0.1</domain> </domain-config> </network-security-config>
生产环境方案
将树莓派服务的证书添加到React Native项目的信任列表:
- iOS:将证书文件添加到项目中,修改
Info.plist配置信任该证书 - Android:将证书放入
res/raw目录,修改network_security_config.xml引用该证书
2. 浏览器环境
浏览器无法通过代码跳过SSL证书验证,只能通过以下方式解决:
- 给树莓派的服务配置由可信CA签发的证书
- 在本地浏览器的证书信任列表中手动导入树莓派的自签名证书
3. Node.js 环境
如果使用node-fetch,可以在请求选项中添加rejectUnauthorized: false(仅测试用):
const fetch = require('node-fetch'); const test_iCast_wifi = async () => { const raw = JSON.stringify({ ssid: 'HUAWEI_B818_4211', password: '4RM9LE059DG', }); try { const response = await fetch('https://10.42.0.1:5000/wifi', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: raw, rejectUnauthorized: false // 跳过证书验证 }); const data = await response.text(); console.log(data); } catch (error) { console.error(error); } };
或者临时设置环境变量:
NODE_TLS_REJECT_UNAUTHORIZED=0 node your-script.js
注意:生产环境绝对不能禁用证书验证,必须配置合法的SSL证书,避免安全风险。
内容的提问来源于stack exchange,提问作者Engr.Aftab Ufaq
相关产品推荐
相关产品推荐

