Flutter报javax.net.ssl.SSLException连接关闭Tag mismatch错误如何解决
报错原因说明
该报错是JVM层SSL握手阶段报文校验失败导致的,Tag mismatch说明收到的SSL报文校验和和预期值不匹配,通常由网络代理拦截、证书篡改、JDK版本bug三类原因导致,按触发场景对应排查解决方法如下:
排查步骤
- 先确认报错触发时机:是执行
flutter pub get/flutter run拉取依赖时触发,还是调用业务服务端接口时触发,两类场景的解决方案完全不同 - 执行
java -version查看本地JDK版本,JDK 8 201及之前的小版本普遍存在SSL校验的已知bug - 检查本地是否开启了代理、VPN、公司内网管控,这类网络设施大概率会篡改SSL证书导致校验失败
- 若为业务接口报错,直接用浏览器访问对应接口地址,确认证书是否有效、是否被篡改
解决方案
场景1:拉取Flutter依赖时报错
- 优先切换国内Pub镜像源,在终端执行对应命令前先设置环境变量:
macOS/Linux 终端执行:
Windows CMD执行:export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn flutter pub getset PUB_HOSTED_URL=https://pub.flutter-io.cn set FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn flutter pub get - 升级本地JDK到8u301以上的稳定版本,或直接配置项目使用Android Studio内置的JRE,规避版本bug
- 关闭本地所有代理、VPN工具后重试,排除网络层篡改SSL报文的问题
场景2:调用业务接口时报错
- 先确认服务端SSL证书在有效期内、证书链完整,没有被运营商或内网设备篡改
- 若使用自签名证书,需要在Flutter的HTTP请求配置中主动信任对应证书,以Dio为例:
import 'package:dio/dio.dart'; import 'package:dio/adapter.dart'; import 'dart:io'; void configDio(Dio dio) { (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.badCertificateCallback = (X509Certificate cert, String host, int port) { // 匹配自签名证书的pem内容后信任,不要直接返回true return cert.pem == "你的自签名证书PEM格式内容"; }; return client; }; } - 测试阶段可临时关闭SSL校验快速验证问题,该配置禁止在生产环境使用
内容的提问来源于stack exchange,提问作者s.j
相关产品推荐
相关产品推荐

