【发布时间】:2022-05-09 17:54:36
【问题描述】:
我有点进退两难。我正在编写一个客户端/服务器应用程序。前端在 Flutter 中,使用 Dio http 包,后端是 Java。后端 REST API 通过 TLS 证书进行保护。
正如许多其他问题所指出的,Flutter 似乎无法访问所有平台上的系统 CA 证书存储。这是有问题的,因为我打算允许服务器应用程序的自托管,这意味着可以在服务器端使用来自所有不同 CA 的证书,因此我的 HTTP 客户端将需要支持典型 Web 浏览器支持的所有 CA。
Dio 显然允许您设置受信任的证书链,但我想知道如何最好地利用它。
以前有没有人遇到过这个问题。您实施了哪些解决方案来解决此问题?
这些是我目前想到的解决方案:
- 允许用户“上传”ca cert bundle 并将字节存储在 shared_preferences 中(对用户来说很难)
- 找到另一种验证证书的方法,例如用户输入指纹? (难度较低,让所有证书无法通过原始验证,然后使用 onBadCertificate 对存储的指纹进行自定义验证)
- 查找提供系统证书存储访问权限的软件包
- 在应用程序中提供大多数知名 CA 证书,并以某种方式信任 Dio
我来到这里的另一个问题是 Dio 似乎忽略了我的 onBadCertificate 方法。我在 ConnectionManager 中声明了这一点,我不应该这样做吗?
这里是被忽略的代码:
var dio = Dio()
..options.baseUrl = server
..interceptors.add(LogInterceptor())
..interceptors.add(CookieManager(cookieJar))
..httpClientAdapter = Http2Adapter(
ConnectionManager(
idleTimeout: 10000,
// Ignore bad certificate
onClientCreate: (_, config) => {
//config.context?.setTrustedCertificatesBytes(File("/assets/certs/wildcard.pem").readAsBytesSync()),
config.onBadCertificate = (_) => true, // <-- ignored, should bypass check
}
),
);
编辑:
正如 cmets 中提到的,Flutter 实际上能够使用系统 CA 证书存储。当我测试其他平台时,如果遇到证书问题,我会更新。不过这个解决了!
【问题讨论】:
-
“Flutter 似乎无法访问所有平台上的系统 CA 证书存储”也许是正确的,但在这些平台上,Flutter 确实带有自己的信任库,其中包含或多或少相同数量的CA 作为 Mozilla。所以,你确定你真的有问题吗?你知道 Flutter 应该支持的不支持的 CA 吗?
-
我使用的是直接从 Entrust 购买的 Entrust 证书。 Dio 无法在 Android 上验证证书,但在 Windows 上运行良好。
-
什么版本的安卓? CA 在电话信任库中吗?
-
替代方案,可能还有很多其他问题。例如。如果您的服务器不发送中间证书。如果某些浏览器可以根据有关中间证书的历史数据猜测根证书,则它们会忽略此问题。配置不当的服务器可以保持隐藏状态。
-
那么,这个问题的状态是什么?您是否找到了解决方案,或者您仍然需要一些帮助来找到核心问题? :)
标签: flutter dart ssl-certificate http2 dio