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

