📅  最后修改于: 2023-12-03 14:40:43.993000             🧑  作者: Mango
这个错误表示在使用 Dio 发送 HTTPS 请求时,SSL 握手失败。Dio 提供的默认行为是验证证书链,如果证书不可信,就会引发这个错误。提示信息中的 CERTIFICATE_VERIFY_FAILED 意味着 SSL 握手失败。
可能的原因有:
在 Dio 中处理这个错误最常见的方法是忽略证书校验,即将 onHttpClientCreate
参数中的 HttpClient
实例的 badCertificateCallback
属性设置为一个总是返回 true 的回调函数。
import 'dart:io';
import 'package:dio/dio.dart';
void main() async {
final dio = Dio();
// 忽略不可信证书
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(client) {
client.badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
return client;
};
try {
final response = await dio.get('https://mysite.com/api');
print(response.data);
} on DioError catch (error) {
print(error);
}
}
另一种方法是让服务器使用受信任的证书,这样请求就可以通过证书验证而不出错。这需要向服务器管理员申请正式的、有信任链的 SSL 证书。
无论使用哪种方法,都需要注意可能存在的安全风险。忽略证书验证可能导致中间人攻击,而信任不可信证书也可能造成安全威胁。