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

Flutter中使用GetX与Get Connect时如何解决SSL证书错误?

解决GetX ApiClient证书验证失败问题

你遇到的CERTIFICATE_VERIFY_FAILED错误是因为客户端不信任目标服务器的SSL证书,通常是自签名证书或证书链不完整导致的,以下分场景给出解决方案:

开发环境临时方案(仅用于测试,禁止生产环境使用)

直接绕过证书验证,修改你的ApiClient构造函数,添加证书回调:

import 'package:flutter_application_shop/utilis/app_constance.dart';
import 'package:get/get.dart';
import 'dart:io'; // 需导入io包

class ApiClient extends GetConnect implements GetxService {
  late String token;
  final String appBaseUrl;
  late Map<String, String> _mainHeaders;

  ApiClient({required this.appBaseUrl}) {
    baseUrl = appBaseUrl;
    timeout = const Duration(seconds: 30);
    token = AppConstance.TOKEN;

    _mainHeaders = {
      'Content-type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer $token',
    };

    // 添加这行,绕过证书验证
    httpClient.badCertificateCallback = (X509Certificate cert, String host, int port) => true;
  }

  Future<Response> getData(String url) async {
    try {
      // 注意:原代码未传递请求头,这里补上_mainHeaders
      Response response = await get(url, headers: _mainHeaders);
      return response;
    } catch (e) {
      return Response(statusCode: 1, statusText: e.toString());
    }
  }
}

生产环境正确方案(推荐)

导入服务器的可信证书到项目,让客户端主动信任该证书:

  1. 将服务器的证书文件(如.crt或.pem格式)放到项目的assets/certs/目录下
  2. 在pubspec.yaml中声明资源:
flutter:
  assets:
    - assets/certs/your_server_certificate.crt
  1. 修改ApiClient加载证书并配置安全上下文:
import 'package:flutter_application_shop/utilis/app_constance.dart';
import 'package:get/get.dart';
import 'dart:io';
import 'package:flutter/services.dart'; // 导入rootBundle

class ApiClient extends GetConnect implements GetxService {
  late String token;
  final String appBaseUrl;
  late Map<String, String> _mainHeaders;

  ApiClient({required this.appBaseUrl}) {
    baseUrl = appBaseUrl;
    timeout = const Duration(seconds: 30);
    token = AppConstance.TOKEN;

    _mainHeaders = {
      'Content-type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer $token',
    };

    // 初始化证书配置
    _setupTrustedCertificate();
  }

  Future<void> _setupTrustedCertificate() async {
    // 加载证书文件
    final ByteData certData = await rootBundle.load('assets/certs/your_server_certificate.crt');
    final List<int> certBytes = certData.buffer.asUint8List();

    // 创建安全上下文并添加可信证书
    final SecurityContext securityContext = SecurityContext.defaultContext;
    securityContext.setTrustedCertificatesBytes(certBytes);

    // 替换httpClient为配置好的客户端
    httpClient = IOClient(HttpClient(context: securityContext));
  }

  Future<Response> getData(String url) async {
    try {
      Response response = await get(url, headers: _mainHeaders);
      return response;
    } catch (e) {
      return Response(statusCode: 1, statusText: e.toString());
    }
  }
}

另外注意:你原代码中的getData方法没有传递_mainHeaders,这会导致请求中缺失Authorization等必要头信息,建议补上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:36:18