Flutter 2.5发送HTTP GET请求出现CERTIFICATE_VERIFY_FAILED证书过期错误
问题原因
你遇到的CERTIFICATE_VERIFY_FAILED: certificate has expired报错是Flutter请求HTTPS接口时,SSL握手阶段客户端校验服务端证书未通过,检测到证书已过期触发的异常。
解决方案
生产环境可用方案
- 先验证目标接口证书状态:用浏览器直接访问你请求的
https://rest.coinapi.io接口地址,点击地址栏的安全标识查看证书有效期,如果确认是服务端证书过期,联系接口提供方更新证书即可解决。 - 若验证服务端证书正常,报错仅出现在Android 7及以下的旧系统设备上,是因为旧系统内置的根证书过期导致的校验失败,可通过内置合法根证书的方式解决:
- 导出目标站点的根证书(PEM格式),放入项目的assets目录,在
pubspec.yaml中声明该资源文件 - 自定义HTTP客户端的证书校验逻辑,优先读取内置的根证书做校验,示例代码如下:
- 导出目标站点的根证书(PEM格式),放入项目的assets目录,在
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
相关产品推荐
相关产品推荐

