Flutter应用连接MongoDB抛出CERTIFICATE_VERIFY_FAILED证书错误
问题根因
你实现的MyHttpOverrides仅对dart:io标准库提供的HttpClient生效,而mongo_dart驱动连接MongoDB时直接调用底层SecureSocket建立TLS连接,完全不会走HttpClient的请求逻辑,因此你设置的全局证书忽略规则根本不会作用到MongoDB连接上,才会持续抛出证书校验失败的错误。
解决方法
本地调试临时方案(禁止用于生产环境)
直接在MongoDB连接的open方法中打开跳过证书校验的开关即可,修改你的MongoDB工具类代码:
import 'package:mongo_dart/mongo_dart.dart'; class MongoDbConnection { static var dbUrl, dbCollection; static dbConnect() async { dbUrl = await Db.create( "mongodb+srv://abdi:abdi@cluster0.soti0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"); await dbUrl.open( secure: true, tlsAllowInvalidCertificates: true, // 跳过TLS证书校验 ); dbCollection = dbUrl.collection("agents"); } }
这个方案会完全忽略TLS证书校验,存在中间人攻击风险,只能本地开发时临时使用。
生产环境合规方案
生产环境不要跳过证书校验,按以下步骤配置:
- 先检查运行应用的设备/模拟器系统时间是否准确,时间偏差超出证书有效期范围也会触发证书校验失败
- 从你使用的MongoDB服务管理后台下载集群对应的CA根证书,将证书文件存放到项目的
assets/certs/目录下,同时在pubspec.yaml中注册该静态资源 - 修改连接代码,加载本地可信证书完成校验:
import 'package:mongo_dart/mongo_dart.dart'; import 'package:flutter/services.dart' show rootBundle; class MongoDbConnection { static var dbUrl, dbCollection; static dbConnect() async { dbUrl = await Db.create( "mongodb+srv://abdi:abdi@cluster0.soti0.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"); // 加载项目内置的可信CA证书 final trustedCA = await rootBundle.loadString('assets/certs/mongo-ca.pem'); await dbUrl.open( secure: true, tlsCAFile: trustedCA, ); dbCollection = dbUrl.collection("agents"); } }
如果配置后仍报错,先将mongo_dart依赖升级到最新稳定版,旧版本的TLS配置参数存在兼容问题。
内容的提问来源于stack exchange,提问作者user15317517
相关产品推荐
相关产品推荐

