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

Flutter中Dio请求遇CERTIFICATE_VERIFY_FAILED证书过期错误求助

解决Flutter Dio请求中CERTIFICATE_VERIFY_FAILED(证书过期)问题

核心错误

请求触发未处理异常,核心原因是CERTIFICATE_VERIFY_FAILED: certificate has expired——客户端与服务端握手时,因服务端SSL证书过期导致验证失败。

有效解决方案

1. 开发环境临时绕过验证(仅测试用,禁止生产环境)

修改Dio配置,关闭证书验证逻辑以快速调试:

import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'dart:io';

void initDio() {
  Dio dio = Dio();
  dio.httpClientAdapter = IOHttpClientAdapter(
    createHttpClient: () {
      final client = HttpClient();
      // 允许所有证书,存在安全风险,仅用于测试
      client.badCertificateCallback = (cert, host, port) => true;
      return client;
    },
  );
}

2. 替换服务端有效证书(生产环境必选)

这是最安全合规的解决方式:

  • 联系服务端运维人员,更新SSL证书,确保证书在有效期内且由可信CA机构签发
  • 证书更新完成后,客户端无需修改代码,重新发起请求即可正常通过验证

3. 自定义信任特定证书(自签名/私有CA场景)

若服务端使用自签名证书或私有CA签发的证书,可将证书文件嵌入项目,让Dio信任该证书:

  1. 将证书文件(如server_cert.pem)放入项目assets目录,在pubspec.yaml中配置资源:
assets:
  - assets/server_cert.pem
  1. 读取证书并配置Dio:
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:flutter/services.dart';
import 'dart:io';

Future<void> initDioWithCustomCert() async {
  Dio dio = Dio();
  // 读取本地证书文件
  String certContent = await rootBundle.loadString('assets/server_cert.pem');
  List<int> certBytes = certContent.codeUnits;

  dio.httpClientAdapter = IOHttpClientAdapter(
    createHttpClient: () {
      final client = HttpClient();
      client.setTrustedCertificatesBytes(certBytes);
      return client;
    },
  );
}

4. 检查设备系统时间

部分场景下,设备系统时间与实际时间偏差过大(早于证书生效时间或晚于过期时间)也会触发该错误,确保设备系统时间为当前正确时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:24