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

Flutter Dio发起HTTPS请求遇TLSV1_ALERT_DECODE_ERROR错误求助

解决方案

1. 补全证书信任链

这个握手错误大概率是证书链不完整导致的。Postman/Thunder Client会自动补全缺失的信任链环节,但Flutter的TLS验证要求完整的根证书+中间证书链。

  • 下载ISRG Root X1根证书,将其与你已有的Let's Encrypt R3证书合并成一个PEM文件(根证书在上、中间证书在下,用换行分隔)。
  • 替换原有的certificate.pem文件后重新测试。

2. 为Dio单独配置自定义HttpClient

修改全局SecurityContext可能不会被Dio的默认HttpClient继承,建议为Dio单独创建带自定义证书的HttpClient:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 加载证书文件
  ByteData data = await PlatformAssetBundle().load('asset/certificate/certificate.pem');
  Uint8List certBytes = data.buffer.asUint8List();

  // 创建自定义SecurityContext和HttpClient
  SecurityContext securityContext = SecurityContext();
  securityContext.setTrustedCertificatesBytes(certBytes);
  HttpClient httpClient = HttpClient(context: securityContext);

  // 初始化Dio并绑定自定义HttpClient
  Dio dio = Dio();
  dio.httpClientAdapter = HttpClientAdapter(
    createHttpClient: () => httpClient,
  );

  runApp(MyApp(dio: dio)); // 将配置好的dio传入应用
}

3. 检查服务器端证书链配置

确保你的actix-web+rustls服务器配置了完整的证书链:

  • rustls要求服务器证书文件包含叶证书+中间证书的完整链(叶证书在前,中间证书在后)。
  • 如果服务器仅返回叶证书,Flutter客户端无法完成信任链验证,会触发握手错误。

4. 验证asset资源配置

确认pubspec.yaml中已正确声明证书资源:

flutter:
  assets:
    - asset/certificate/certificate.pem

5. 排查证书格式问题

检查certificate.pem文件内容:

  • 确保是纯PEM格式,无多余空行、注释或乱码。
  • 每个证书块必须以-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:21