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

Dart调用API发起POST请求时出现NO_RENEGOTIATION(ssl_lib.cc:1725)错误求助

解决Dart调用API时出现NO_RENEGOTIATION SSL错误的方案

核心原因

这个错误是SSL握手阶段重协商失败导致的,Dart的IOClient依赖操作系统底层的SSL实现,生产环境与本地环境的SSL配置差异、目标API服务器的SSL策略和Dart客户端的兼容性不匹配是主要诱因——而Python、Java的HTTP客户端默认SSL策略和Dart不同,所以能正常请求。

具体解决方法

  • 替换HTTP客户端配置:改用dart:io的HttpClient手动配置SSL规则,示例代码:
    import 'dart:io';
    import 'package:http/http.dart' as http;
    
    Future<http.Response> fetchTargetApi() async {
      final client = HttpClient()
        ..badCertificateCallback = (cert, host, port) => true; // 注意:生产环境请勿直接忽略证书验证,需替换为合法的证书校验逻辑
      final ioClient = http.IOClient(client);
      try {
        return await ioClient.get(Uri.parse('你的目标API地址'));
      } finally {
        ioClient.close();
      }
    }
    
  • 强制指定SSL协议版本:限制Dart使用目标API兼容的SSL协议(比如TLS 1.2),避免自动协商触发重协商:
    import 'dart:io';
    import 'package:http/http.dart' as http;
    
    Future<http.Response> fetchTargetApi() async {
      final context = SecurityContext();
      context.setProtocolVersions([SslProtocol.tls12]);
      final client = HttpClient(context: context);
      final ioClient = http.IOClient(client);
      try {
        return await ioClient.get(Uri.parse('你的目标API地址'));
      } finally {
        ioClient.close();
      }
    }
    
  • 检查生产环境证书链:确认生产环境服务器是否包含目标API证书链的根证书,缺失根证书会导致Dart客户端验证失败触发重协商。
  • 禁用SSL重协商:若目标API服务器支持,通过调整Dart客户端底层SSL参数禁用重协商(需结合生产环境操作系统的SSL配置修改)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:51