You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Android端已装证书仍出现CERTIFICATE_VERIFY_FAILED错误求助

Flutter自签名证书验证失败问题:浏览器正常但应用报错的原因与解决方法

一、核心原因:浏览器与Flutter的证书信任机制差异

Chrome浏览器会同时读取用户级和系统级的受信任凭据,你将根CA安装到"受信任凭据>用户"目录后,浏览器能正常识别并信任由该CA签发的服务器证书。

但Flutter基于Dart的HttpClient默认仅信任系统级预装的根证书,不会读取用户手动安装的证书,因此即使你在设备上安装了根CA,应用依然会验证失败。

另外需额外检查:如果应用是通过IP地址访问API,但你的cert.conf中未将该IP加入subjectAltName,也会触发证书验证失败(浏览器若用域名访问则不受影响)。

二、让Flutter应用识别自签名证书的可行方案

方案1:将根CA嵌入应用并配置安全上下文

这是最适合开发/测试环境的方案,无需修改设备系统:

  1. 将rootCA.crt放入Flutter项目的assets目录
  2. 在pubspec.yaml中声明资源:
assets:
  - assets/rootCA.crt
  1. 加载证书并创建信任该CA的HttpClient:
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;

Future<http.Client> getTrustedClient() async {
  final securityContext = SecurityContext.defaultContext;
  // 加载根CA证书文件
  final certData = await rootBundle.load('assets/rootCA.crt');
  securityContext.setTrustedCertificatesBytes(certData.buffer.asUint8List());
  
  return http.IOClient(HttpClient(context: securityContext));
}

// 使用示例
void fetchApi() async {
  final client = await getTrustedClient();
  final response = await client.get(Uri.parse('https://example.com/api'));
  // 处理响应
}

方案2:将根CA安装到设备系统级凭据(需ROOT)

如果是测试用的ROOT设备,可以将根CA证书安装到**"受信任凭据>系统"**目录下(系统目录默认只读,需ROOT权限写入)。这种方式无需修改代码,但不适用于非ROOT的生产设备。

方案3:修正证书的Subject Alternative Name(SAN)配置

确保API的访问地址(域名/IP)都包含在证书的SAN中:

  1. 修改cert.conf,补充IP或域名:
[alt_names]
DNS.1 = example.com
IP.1 = 10.10.10.10
  1. 重新生成服务器证书和PFX文件,更新IIS的网站绑定

三、重要提醒

绝对不要在生产环境使用badCertificateCallback = (_,__,__) => true绕过证书验证,这会完全取消SSL/TLS的安全防护,导致请求易被中间人攻击。生产环境建议使用权威CA颁发的合规证书。

内容的提问来源于stack exchange,提问作者Khalil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:54:23