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
相关产品推荐
相关产品推荐

