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

Flutter 2.5发送HTTP GET请求出现CERTIFICATE_VERIFY_FAILED证书过期错误

问题原因

你遇到的CERTIFICATE_VERIFY_FAILED: certificate has expired报错是Flutter请求HTTPS接口时,SSL握手阶段客户端校验服务端证书未通过,检测到证书已过期触发的异常。

解决方案

生产环境可用方案

  • 先验证目标接口证书状态:用浏览器直接访问你请求的https://rest.coinapi.io接口地址,点击地址栏的安全标识查看证书有效期,如果确认是服务端证书过期,联系接口提供方更新证书即可解决。
  • 若验证服务端证书正常,报错仅出现在Android 7及以下的旧系统设备上,是因为旧系统内置的根证书过期导致的校验失败,可通过内置合法根证书的方式解决:
    1. 导出目标站点的根证书(PEM格式),放入项目的assets目录,在pubspec.yaml中声明该资源文件
    2. 自定义HTTP客户端的证书校验逻辑,优先读取内置的根证书做校验,示例代码如下:
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart';

Future<http.Client> customHttpClient() async {
  final certData = await rootBundle.load('assets/coinapi_root_cert.pem');
  final securityContext = SecurityContext()
    ..setTrustedCertificatesBytes(certData.buffer.asUint8List());
  final httpClient = HttpClient(context: securityContext);
  return IOClient(httpClient);
}

// 调用示例
final client = await customHttpClient();
var currencyData = await client.get(Uri.parse('https://rest.coinapi.io/v1/exchangerate/BTC/USD?apikey=------------------------'));

本地临时调试方案(禁止在生产环境使用,会存在严重的安全风险)

如果仅为本地调试快速验证逻辑,可以直接跳过证书校验,示例代码如下:

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart';

Future<http.Response> skipCertGet(Uri url) async {
  final httpClient = HttpClient()
    ..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
  final client = IOClient(httpClient);
  return await client.get(url);
}

// 替换原有请求代码
var currencyData = await skipCertGet(Uri.parse('https://rest.coinapi.io/v1/exchangerate/BTC/USD?apikey=------------------------'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:03