【问题标题】:Assets Folder in flutter/ dart folder for client certificate authentication用于客户端证书身份验证的 flutter/dart 文件夹中的 Assets 文件夹
【发布时间】:2021-10-20 15:02:35
【问题描述】:

我正在尝试在 dart 中进行客户端证书身份验证。但是当我用颤振编译应用程序时,我一直找不到 cert.p12。这是我进行证书身份验证的方式。

HttpClient createHttpClient(SecurityContext context) {
final cert = "assets/cert.p12";
final password = "mittal";
final sc = SecurityContext.defaultContext
  ..useCertificateChain(cert, password: password)
  ..usePrivateKey(cert, password: password);
return super.createHttpClient(sc)

我的 assets 文件夹位于项目的根目录,而 cert.p12 就在其中。请帮忙。

这是android studio的截图:

The Screenshot

我已经阅读了https://flutter.dev/docs/development/ui/assets-and-images 并添加了,但仍然是同样的问题。请帮忙

flutter:
  assets:
    - assets/
    - assets/cert.p12

【问题讨论】:

  • 请查看this关于如何声明和加载和资产。
  • 嗨,我修改了这个并将这个添加到我的 pubspec.yaml 中。颤振:资产:-资产/-资产/cert.p12。但还是同样的问题
  • 请添加您的assets 部分pubspec.yaml 和您尝试获取它的代码。另外,请注意,热重启/重新加载可能不会反映添加资产,以确保重新启动调试会话。
  • 我真的不知道该怎么做,比如从 pubspec.yaml 添加资产部分
  • 好的,如果您有assets: - assets/cert.p12,并且您的assets 文件夹中有这个cert.p12 文件,您是如何尝试加载它的?

标签: flutter dart authentication certificate client


【解决方案1】:

其实你是这么说的:

String cert = "assets/cert.p12"

这是一个对我来说如何工作的示例:

final clientCert = await rootBundle.load('assets/cert.p12');

context.useCertificateChainBytes(clientCert.buffer.asUint8List(), password: password);

这是一个完整的例子:

class MyHttpOverrides extends HttpOverrides {
  ByteData clientCert;
  ByteData keystore;

  MyHttpOverrides({
    required this.clientCert,
    required this.keystore,
  });

  @override
  HttpClient createHttpClient(SecurityContext? context) {
    context = SecurityContext.defaultContext;

    bool _certificateCheck(truststore, String host, int port) {
      return host == "test.backend.com";
    }

    String password = "password";

    context.useCertificateChainBytes(clientCert.buffer.asUint8List(), password: password);

    context.usePrivateKeyBytes(keystore.buffer.asUint8List(), password: password);

    HttpClient client = super.createHttpClient(context)..badCertificateCallback = (_certificateCheck);

    client..badCertificateCallback = (_certificateCheck);

    return client;
  }
}

并像这样使用它:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final clientCert = await rootBundle.load('assets/cert.pem');
  final keystore = await rootBundle.load('assets/key.pem');

  HttpOverrides.global = MyHttpOverrides(
    clientCert: clientCert,
    keystore: keystore,
  );
  runApp(MyApp());
}

这些是进口:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

【讨论】:

  • 哦,好的,所以我将 useCertificateChain 更改为 useCertificateChainBytes,将 usePrivateKey 更改为 usePrivateKeyBytes。并像你写的那样加载它。
  • 现在它使 createHttpClient 成为异步的未来。并给我一个错误。
  • 它给了我这个错误“未来”来自“飞镖:异步”。 - 'HttpClient' 来自'dart:_http'。更改为“HttpClient”的子类型。 Future createHttpClient(SecurityContext context) async { ^ org-dartlang-sdk:///third_party/dart/sdk/lib/_http/overrides.dart:72:14: Context: 这是被覆盖的方法 ('createHttpClient ')。 HttpClient createHttpClient(SecurityContext?context) { ^
  • 嗨,有没有办法在没有异步的情况下做到这一点?
  • 没有。就是这样。
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2017-11-07
  • 2023-04-10
  • 2011-04-09
  • 2013-10-07
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多