Flutter调用本地.NET API报CERTIFICATE_VERIFY_FAILED证书验证错误
问题根因
你遇到的证书校验失败错误,核心原因是代码逻辑无效:你虽然创建了配置badCertificateCallback的自定义HttpClient,但实际调用http.get()发请求时,用的是http包默认内置的请求客户端,完全没有用到你自定义的、允许自签名证书的HttpClient,因此HTTPS握手阶段依然会校验本地.NET API的自签名证书,触发CERTIFICATE_VERIFY_FAILED报错。
另外你用的10.0.2.2是安卓模拟器访问宿主机的专用映射地址,这个配置本身没有问题。
解决方案
以下方案仅适用于本地开发调试场景,禁止在正式发布版本中使用,避免引入HTTPS中间人攻击风险。
- 方案1:给请求绑定自定义HttpClient,单接口生效
首先导入依赖包,然后用自定义HttpClient构造IOClient发起请求,修正后的代码如下:
import 'dart:io'; import 'package:http/http.dart' as http; import 'package:http/io_client.dart'; static Future fetchCordinates() async { HttpClient client = HttpClient(); client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); // 用自定义HttpClient构造http请求客户端 final requestClient = IOClient(client); var studentUrl =Uri.parse('https://10.0.2.2:44363/address-lookup?address=house%20no%20122%20'); print(studentUrl); // 用自定义客户端发请求,替代原来的全局http.get http.Response response=await requestClient.get(studentUrl,headers: {"Accept": "application/json"}); print(response.body); return response; }
- 方案2:全局配置证书校验规则,所有请求生效
如果项目里有多个接口都要访问本地自签名的API,可以在应用启动时全局覆盖Http配置,无需每个接口单独处理:
import 'dart:io'; import 'package:flutter/material.dart'; void main() { // 全局配置忽略自签名证书校验 HttpOverrides.global = LocalDevHttpOverrides(); runApp(const MyApp()); } class LocalDevHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context) ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; } }
额外注意事项
- 如果你用iOS模拟器调试,不需要用
10.0.2.2映射地址,直接将接口地址改为https://localhost:44363即可正常访问宿主机接口。 - 如果你用真机调试,
10.0.2.2和localhost都无法访问宿主机服务,需要替换为你开发电脑在当前局域网内的实际IP,同时保证手机和电脑连接同一WiFi,且.NET API已开启局域网访问权限。 - 正式打包上线前必须删除所有证书绕过逻辑,否则会存在严重安全隐患。
内容的提问来源于stack exchange,提问作者atiq ur rahman
相关产品推荐
相关产品推荐

