【问题标题】:Flutter requests using Certificates and SSLFlutter 使用证书和 SSL 的请求
【发布时间】:2022-01-01 13:34:55
【问题描述】:

我正在尝试从 Flutter 向 myapp 服务发送 GET/POST 请求。 现在我正在从 POSTMAN 执行此操作,我已经配置了 CA 证书,以及具有 3 个配置的 客户端证书:(主机、Crt 文件、密钥文件)。

现在在 POSTMAN 中效果很好,我收到了响应。 在颤振上,我不确定如何提取这 3 个文件并创建 Get 请求以获取响应。

对我如何在颤振中实现它有任何帮助吗?

我试过这个:

void getAPI() {
  var url = "https://controller.test.io/v1/";
  SecurityContext context = SecurityContext();
  context.setTrustedCertificates("/Users/me/keys/crtfile");
  context.usePrivateKey("/Users/me/keys/keyfile");
  HttpClient client = new HttpClient(context: context);
  client.getUrl(Uri.parse(url))
      .then((HttpClientRequest request) => request.close())
      .then((HttpClientResponse response) {
    response.transform(utf8.decoder).listen((contents) {
      print(contents);
    });
  });
}

但我明白了:

Cannot open file, path = '/Users/me/keys/crtfile' (OS Error: Operation not permitted, errno = 1)

#attempt 2:

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}


Future<void> getdata() async {
  var url = "https://controller.mine.try/api/v1";
  WidgetsFlutterBinding.ensureInitialized();
  HttpOverrides.global = MyHttpOverrides();
  SecurityContext context = SecurityContext();
  HttpClient client = HttpClient(context: context);
  client.maxConnectionsPerHost=5;
  try {
    HttpClientRequest request = await client.getUrl(Uri.parse(url));
    HttpClientResponse response = await request.close();
    final stringData = await response.transform(utf8.decoder).join();
    print(stringData);
  } finally {
    client.close();
  }

结果:

Unhandled Exception: HttpException: Connection closed before full header was received, uri 

【问题讨论】:

  • 在一个普通的 Dart 项目中,从文件中读取字节并使用usePrivateKeyBytes。测试有效。然后,在 Flutter 中,将文件添加为资产,加载它们(您最终会得到 ByteData,因此使用 .buffer.asUint8List() 转换为字节)并继续如上。您很有可能不想将私钥放在生产应用程序的资产中 - 您可能需要考虑一种不同的方式来验证客户端而不是客户端证书。
  • 我不确定如何执行您提到的所有步骤。你能告诉我代码吗? @RichardHeap 该应用程序将本地化。我不想把crt放到网上,只能从本地电脑上拉出来。
  • 这个问题已经涵盖了它:stackoverflow.com/questions/56300017/…
  • @RichardHeap 我试过但它请求资产。我希望用户从他的电脑中选择路径。可以吗?用户已经可以选择路径,我可以使用该路径。但我如何使用它:rootBundle.load?

标签: flutter dart postman flutter-dependencies


【解决方案1】:

你不需要配置 ca 文件。只需按照以下方式进行即可。它在我的项目中完美运行。

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  HttpOverrides.global = MyHttpOverrides();
 
  runApp(
     MyApp()
  );
}

【讨论】:

  • 我不确定如何在我的代码中使用它?它如何不需要 ca 或密钥文件?我的端点需要这种身份验证方式。就像我在邮递员中使用的那样......
  • 我已经在主帖中添加了第二次尝试,你可以看看吗?
  • 请添加您的主要功能。请检查我的代码。
  • 主函数是什么意思?
  • main() 这个函数
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多