Flutter调用本地ASP.NET Core后端遇证书验证失败问题求助
解决Flutter调用本地ASP.NET Core后端的CERTIFICATE_VERIFY_FAILED错误
问题背景
开发Flutter应用时,向本地ASP.NET Core后端发起HTTP API调用,在Android Studio模拟器中遇到以下错误:
Handshake Exception: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate (handshake.cc:393))
Flutter请求代码:
final url = Uri.parse('http://10.0.2.2:7095/api/UserAccount/login'); final response = await http.post( url, headers: {'Content-Type': 'application/json'}, body: jsonEncode({"email": "test@example.com", "password": "password"}), );
已配置HttpOverrides绕过SSL验证:
class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context) ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; } } void main() { HttpOverrides.global = MyHttpOverrides(); runApp(MyApp()); }
ASP.NET Core后端launchSettings.json配置:
"applicationUrl": "http://localhost:7095 ;https://localhost:5000",
已尝试验证后端可通过浏览器访问、使用10.0.2.2访问、添加HttpOverrides、关闭防火墙,但问题依旧。
解决方案
1. 检查后端是否强制HTTPS重定向
ASP.NET Core默认会启用HTTPS重定向,即使你请求的是HTTP地址,也会被自动跳转到HTTPS,导致证书验证失败:
- 打开后端项目的
Program.cs,查找app.UseHttpsRedirection();代码,暂时注释掉(仅开发环境)后重启后端服务。 - 或者在
appsettings.json中添加配置关闭HTTPS重定向:"HttpsRedirection": { "Enabled": false }
2. 确保HttpOverrides正确生效
若初始化顺序或其他代码导致HttpOverrides未生效,可直接创建自定义HttpClient:
final client = HttpClient() ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; final request = await client.postUrl(Uri.parse('http://10.0.2.2:7095/api/UserAccount/login')); request.headers.set('Content-Type', 'application/json'); request.write(jsonEncode({"email": "test@example.com", "password": "password"})); final response = await request.close(); final responseBody = await response.transform(utf8.decoder).join();
3. 验证模拟器网络连通性
在Android模拟器的内置浏览器中访问http://10.0.2.2:7095,确认能正常打开后端页面:
- 若无法访问,用
netstat -ano | findstr :7095命令验证后端是否在7095端口运行。 - 修改launchSettings.json的
applicationUrl为http://0.0.0.0:7095;https://localhost:5000,让后端监听所有网络接口。
4. 开发环境下信任本地HTTPS证书(推荐)
如需使用HTTPS,不要直接绕过验证,而是让Flutter信任本地开发证书:
- 导出ASP.NET Core开发证书:
命令行执行dotnet dev-certs https --export-path ~/localhost.pfx --password yourpassword(替换路径和密码)。 - 将导出的
.pfx文件复制到Flutter项目assets目录,并在pubspec.yaml声明:assets: - assets/localhost.pfx - 在Flutter中加载证书并配置HttpClient:
final ByteData data = await rootBundle.load('assets/localhost.pfx'); final SecurityContext context = SecurityContext.defaultContext; context.setTrustedCertificatesBytes(data.buffer.asUint8List(), password: 'yourpassword'); final client = HttpClient(context: context); // 后续使用该client发起请求
内容的提问来源于stack exchange,提问作者Abiskar Gyawali
相关产品推荐
相关产品推荐

