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()); } } }
生产环境正确方案(推荐)
导入服务器的可信证书到项目,让客户端主动信任该证书:
- 将服务器的证书文件(如
.crt或.pem格式)放到项目的assets/certs/目录下 - 在
pubspec.yaml中声明资源:
flutter: assets: - assets/certs/your_server_certificate.crt
- 修改
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
相关产品推荐
相关产品推荐

