如何修改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
相关产品推荐
相关产品推荐

