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信任该证书:
- 将证书文件(如
server_cert.pem)放入项目assets目录,在pubspec.yaml中配置资源:
assets: - assets/server_cert.pem
- 读取证书并配置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
相关产品推荐
相关产品推荐

