📌  相关文章
📜  DioError [DioErrorType.DEFAULT]:HandshakeException:客户端中的握手错误(操作系统错误:我颤动(28831):CERTIFICATE_VERIFY_FAILED:自签名证书(handshake.cc:354))\ (1)

📅  最后修改于: 2023-12-03 14:40:43.993000             🧑  作者: Mango

DioError [DioErrorType.DEFAULT]: HandshakeException: 客户端中的握手错误

这个错误表示在使用 Dio 发送 HTTPS 请求时,SSL 握手失败。Dio 提供的默认行为是验证证书链,如果证书不可信,就会引发这个错误。提示信息中的 CERTIFICATE_VERIFY_FAILED 意味着 SSL 握手失败。

可能的原因有:

  • 服务器使用了自签名证书,而不是由受信任的证书机构颁发的证书;
  • 网络代理或防火墙篡改了证书,或者攻击者在中间插入恶意证书;
  • 客户端与服务器之间的 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 证书。

无论使用哪种方法,都需要注意可能存在的安全风险。忽略证书验证可能导致中间人攻击,而信任不可信证书也可能造成安全威胁。