Flutter中如何为Chopper客户端添加SSL .cert证书
实现步骤
- 第一步:将
tls.cert文件放入项目资源目录,例如assets/certs/路径下,随后在pubspec.yaml中声明该资源,确保运行时可以读取到文件内容:
flutter: assets: - assets/certs/tls.cert
- 第二步:加载证书文件,自定义
HttpClient的证书校验逻辑,再将自定义客户端注入到ChopperClient中,配置完成后所有通过该ChopperClient发起的请求都会自动应用证书规则:
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:http/io_client.dart'; import 'package:chopper/chopper.dart'; Future<ChopperClient> initChopperClient() async { // 读取本地证书文件内容 final certBytes = await rootBundle.load('assets/certs/tls.cert').then( (byteData) => byteData.buffer.asUint8List(), ); // 方案1:通过SecurityContext添加信任证书,适合CA签发证书、根证书校验场景 final securityContext = SecurityContext() ..setTrustedCertificatesBytes(certBytes); final httpClient = HttpClient(context: securityContext); // 方案2:自定义证书校验逻辑,适合自签名证书场景,只会信任和本地证书一致的请求 // final httpClient = HttpClient() // ..badCertificateCallback = (X509Certificate cert, String host, int port) { // return cert.pem == String.fromCharCodes(certBytes); // }; // 包装HttpClient为Chopper支持的Client类型 final customClient = IOClient(httpClient); // 初始化ChopperClient时传入自定义Client return ChopperClient( baseUrl: Uri.parse('你的后端服务基地址'), client: customClient, // 其余原有配置:转换器、拦截器等保持不变即可 ); }
注意事项
- 生产环境禁止直接在
badCertificateCallback中返回true,该操作会跳过所有证书校验,存在严重的安全风险 - 如果你需要信任多个证书,可将所有证书内容存入集合,在校验时判断返回的证书是否在信任集合内即可
两种配置方案选择建议:
没有特殊自定义校验需求优先选方案1,逻辑更简洁也更符合TLS校验规范;自签名证书、需要针对特定域名做特殊校验的场景选方案2,灵活性更高。
内容的提问来源于stack exchange,提问作者Lingo
相关产品推荐
相关产品推荐

