如何解决Flutter调用ASP.NET Core API报CERTIFICATE_VERIFY_FAILED证书错误
Flutter调用ASP.NET Core API CERTIFICATE_VERIFY_FAILED 报错解决方案
以下是按优先级排序的可落地解决方案:
第一,排查HttpOverrides配置是否生效
绝大多数配置后不生效的原因是配置位置错误,必须将全局覆现代码放在main()函数的runApp()执行之前,正确配置示例如下:import 'dart:io'; import 'package:flutter/material.dart'; class DevHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context) ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; } } void main() { // 必须放在runApp之前执行 HttpOverrides.global = DevHttpOverrides(); runApp(const MyApp()); }注意该配置仅对系统默认
HttpClient生效,如果你使用第三方HTTP请求库需要单独配置。第二,第三方请求库单独配置证书忽略
如果你使用dio库发起请求,默认不会读取全局HttpOverrides配置,需要单独为dio实例设置证书校验规则:import 'package:dio/dio.dart'; import 'package:dio/io.dart'; import 'package:flutter/foundation.dart'; Dio createDio() { final dio = Dio(); // 开发环境忽略证书校验 if (kDebugMode) { (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.badCertificateCallback = (cert, host, port) => true; return client; }; } return dio; }所有请求都要使用经过上述配置的dio实例发起,否则配置不生效。
第三,安卓端额外网络配置
安卓9及以上系统默认限制未信任的自签名证书和HTTP请求,需要额外添加网络安全配置:- 在
android/app/src/main/res/目录下新建xml文件夹,创建network_security_config.xml文件,写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> <!-- 替换为你实际的API域名/IP,不需要带端口和http/https前缀 --> <domain includeSubdomains="true">192.168.1.2</domain> <domain includeSubdomains="true">your-api-domain.com</domain> </network-security-config>- 打开
android/app/src/main/AndroidManifest.xml,在application标签中添加两个属性:
<application android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true" <!-- 其余原有配置保持不变 --> >- 在
第四,本地调试特殊适配
如果你使用安卓模拟器访问宿主机上的ASP.NET Core服务,不能直接用localhost,要替换为模拟器内置的宿主机映射地址10.0.2.2,比如原API地址是https://localhost:7045/api/register,模拟器里要改成https://10.0.2.2:7045/api/register。
也可以在本地开发阶段暂时将ASP.NET Core改为HTTP协议监听,直接请求HTTP地址规避证书问题。
内容的提问来源于stack exchange,提问作者user10309793
相关产品推荐
相关产品推荐

