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

Flutter安卓模拟器运行失败:SSL证书信任问题(已导入证书仍报错)求助

Flutter安卓模拟器SSLHandshakeException排查方案

核心问题回顾

iOS模拟器可正常运行应用,但安卓模拟器抛出javax.net.ssl.SSLHandshakeException: 无法找到请求目标的有效认证路径;已尝试将证书导入系统JRE信任库,但无效。

关键原因说明

安卓模拟器不依赖系统JRE的信任库,它拥有独立的证书存储体系;同时Flutter安卓端的网络请求依赖安卓系统NetworkStack或OkHttp框架,因此导入系统JRE证书无法解决问题。

具体排查&修复步骤

1. 针对安卓应用配置信任证书

方式一:Flutter端直接加载证书(推荐调试用)

  • 将证书文件server-cert.pe放到Flutter项目的assets/certificates目录,在pubspec.yaml中声明资源:
    assets:
      - assets/certificates/server-cert.pe
    
  • 在网络请求代码中加载证书:
    import 'dart:io';
    import 'package:http/http.dart' as http;
    
    void main() async {
      SecurityContext context = SecurityContext.defaultContext;
      // 加载本地证书
      context.setTrustedCertificates('assets/certificates/server-cert.pe');
      HttpClient client = HttpClient(context: context);
      
      // 发起请求示例
      var request = await client.getUrl(Uri.parse("https://example.com/api"));
      var response = await request.close();
      // 处理响应...
    }
    

方式二:给安卓模拟器系统导入证书

安卓系统信任库路径为/system/etc/security/cacerts,需按以下步骤操作:

  1. 生成证书哈希值:
    keytool -printcert -file server-cert.pe | grep SHA256
    
    提取哈希值(去掉所有冒号)
  2. 将证书转为PEM格式:
    openssl x509 -in server-cert.pe -out server-cert.pem
    
  3. 重命名PEM文件为<哈希值>.0(例如abc123def456.0)
  4. 推送文件到模拟器并设置权限:
    adb push <哈希值>.0 /system/etc/security/cacerts/
    adb shell chmod 644 /system/etc/security/cacerts/<哈希值>.0
    
  5. 重启模拟器生效

2. 检查Gradle配置

  • 确认gradle.properties中是否配置了正确的信任库路径(调试阶段可临时指定):
    org.gradle.jvmargs=-Djavax.net.ssl.trustStore=/path/to/your/custom/cacerts
    
  • 检查gradle-wrapper.properties的distributionUrl,建议升级到稳定版Gradle(如7.6+),避免旧版本SSL兼容性问题

3. 验证证书完整性

  • 使用openssl检查服务器证书链是否完整:
    openssl s_client -connect example.com:443
    
    若输出中显示Verify return code: 20 (unable to get local issuer certificate),说明缺少根CA或中间CA证书,需导入完整证书链而非仅服务器证书

4. 临时调试方案(上线禁用)

若需快速验证业务逻辑,可临时绕过SSL证书验证(仅限调试,上线必须移除):

import 'dart:io';

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());
}

辅助检查点

  • 查看flutter doctor输出,确认安卓SDK、NDK、Gradle版本兼容
  • 确认$JAVA_HOME指向安卓SDK自带JDK(如~/Library/Android/sdk/jre),而非系统JDK
  • 分析Debug Console的完整栈跟踪,确认错误发生在网络请求阶段还是Gradle构建阶段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:20