返回

Flutter Android 上用户受信任证书问题:如何加载和解决?

Android

Flutter 中 Android 上用户受信任证书不受信任:解决方案

问题:

在 Flutter 应用中使用 Android 受信任证书时遇到问题,因为 Flutter 无法自动加载这些证书。

解决方案:

尽管 Flutter 无法自动加载用户受信任的证书,但可以从 Flutter 应用中手动加载这些证书。

步骤:

  1. 获取自签名 CA 证书的内容。
  2. 创建一个带有 withTrustedRoots: true 属性的安全上下文。
  3. 使用 setTrustedCertificatesBytes 方法将证书添加到安全上下文中。
  4. 创建一个带有自定义安全上下文的 HttpOverrides 类。
  5. 将自定义 HttpOverrides 设置为全局覆盖。

示例代码:

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:http/http.dart';

final rootCAString = '''-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwI...<certContentsHere>
-----END CERTIFICATE-----''';

class AcceptTrustedCertsHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    SecurityContext trustedRootsContext = SecurityContext(withTrustedRoots: true);
    final certBytes = Uint8List.fromList(utf8.encode(rootCAString));
    trustedRootsContext.setTrustedCertificatesBytes(certBytes);
    final client = super.createHttpClient(trustedRootsContext);
    return client;
  }
}

void main() {
  HttpOverrides.global = AcceptTrustedCertsHttpOverrides();
}

注意事项:

  • 将证书字符串存储在安全的字符串常量中。
  • 考虑使用 flutter_ssl_pinning 插件进行更高级的证书固定和验证。

常见问题解答:

  1. 为什么 Flutter 无法自动加载用户受信任的证书?
    Flutter 使用 Dart VM,该 VM 无法利用 Android 原生的用户受信任证书功能。

  2. 使用自签名证书安全吗?
    不,自签名证书通常不安全,因为它们未经受信任的 CA 颁发。仅在受控环境中使用它们。

  3. 为什么需要设置 HTTP 覆盖?
    HTTP 覆盖允许 Flutter 在建立所有 HTTP 连接时使用自定义安全上下文。

  4. 如何知道证书是否已加载成功?
    可以通过尝试连接到受保护的端点并查看响应来验证证书是否已成功加载。

  5. 还有哪些其他方法可以处理用户受信任的证书?
    可以使用 package:android_intent 插件打开 Android 设置并提示用户安装证书。

结论:

遵循这些步骤,可以从 Flutter 应用中手动加载用户受信任的证书,从而建立安全的 HTTPS 连接。通过仔细遵循说明,你可以解决此问题并为你的 Flutter 应用实现安全通信。