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

如何修改http-package代码,通过badCertificateCallback接受自签名证书

解决自签名证书的HTTP请求问题

没问题,要让你的Dart HTTP请求接受自签名证书,核心是要自定义一个跳过证书验证的HttpClient,再用IOClient把它包装成http包能用的Client实例——默认的Client()会严格验证证书,所以自签名的会被直接拒绝。

下面是修改后的完整代码:

import 'package:http/http.dart' show Client, IOClient, Response;
import 'dart:convert';
import 'dart:io'; // 引入HttpClient依赖的包

// 自定义忽略证书验证的Client实例
final Client _client = IOClient(HttpClient()
  ..badCertificateCallback =
      ((X509Certificate cert, String host, int port) => true));

Future<dynamic> postRequest(User user, String uri, String postBody, {decode: true}) async {
  try {
    var url = user.protocol + '://' + user.hostname + ':' + user.port + uri;
    String basicAuth = 'Basic ' + base64Encode(utf8.encode('${user.username}:${user.password}'));
    var appHeaders = {
      'authorization': basicAuth,
      "Content-Type": "application/xml",
      "Accept": "application/json"
    };
    // 建议用Uri.parse处理URL,比纯字符串拼接更安全规范
    String resBody = await _client
        .post(Uri.parse(url), body: postBody, headers: appHeaders)
        .then((Response res) => res.body);
    if (decode) {
      return json.decode(resBody);
    } else {
      return resBody;
    }
  } catch (e) {
    return e;
  } finally {
    // 若client是全局复用的,可不用在此关闭,在程序退出时统一处理即可
    // _client.close();
  }
}

重要提醒:

  • badCertificateCallback返回true意味着接受所有不符合标准的证书,这在生产环境非常不安全,仅限测试/开发场景使用。
  • 如果是生产环境,建议不要完全跳过验证,而是在回调里添加逻辑,只信任你指定的自签名证书(比如对比证书的指纹信息)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:45