【问题标题】:Flutter add self signed certificate from asset folderFlutter 从资产文件夹添加自签名证书
【发布时间】:2019-06-03 21:45:01
【问题描述】:

我的服务器在调用其 HTTPS API 时提供自签名证书。我在asset 文件夹中有证书文件,并在pubspec.yaml 中引用了它的路径 我尝试将证书传递给SecurityContext,然后使用该上下文创建HttpClient。但是我将证书传递给SecurityContext 的方式不起作用。代码如下:

Future<ByteData> getFileData(String path) async {
    return await rootBundle.load(path);
}

void initializeHttpClient() async {
    try {
         Future<ByteData> data = getFileData('assets/raw/certificate.crt');
         await data.then((value) {
             var context = SecurityContext.defaultContext;
             context.useCertificateChainBytes(value.buffer.asInt8List());
             client = HttpClient(context: context);
         });

    } on Exception catch (exception) {
         print(exception.toString());
    }
}

SecurityContext 有两种方法:
1) useCertificateChain() 这接受文件路径。但是当我在我的资产文件夹('assets/raw/certificate.crt')中给出文件的路径时。它说找不到文件。
2)useCertificateChainBytes()上面的代码就是用这个方法的。但这也给了我类似(意外的文件结尾)之类的错误。

目前的解决方案

我正在使用 client.badCertificateCallback = (X509Certificate cert, String host, int port)=&gt; true; 绕过它。

但我想让它与证书一起使用

【问题讨论】:

    标签: dart flutter dart-http


    【解决方案1】:

    从您的问题中不清楚自签名证书的作用是什么。根据您的工作,我假设它是您在 HTTPS 服务器中安装的服务器端证书。 (这不是您要传递给服务器的客户端证书。)

    因此,您需要做的是让 Dart HttpClient 信任该证书,该证书将作为 TLS 握手的一部分由服务器传递给它。 (通过设置回调,您使客户端信任任何证书,而不仅仅是您的服务器的。)

    要设置受信任的证书,请使用 setTrustedCertificatesBytes 代替 useCertificateChainBytes(如果您的证书是客户端证书,您将使用它)。

    您不能以Files 的身份直接访问资产,因为它们是由构建捆绑的。通过加载它们并使用...Bytes 方法,您正在做正确的事情。您可以像这样提高代码的可读性(删除then)。另外,请注意对Uint8List的细微更改

    ByteData data = await rootBundle.load('assets/raw/certificate.crt');
    SecurityContext context = SecurityContext.defaultContext;
    context.setTrustedCertificatesBytes(data.buffer.asUint8List());
    client = HttpClient(context: context);
    

    【讨论】:

    • 您确定此代码有效吗?因为据我所知,它会抛出文件未找到异常的错误。 @理查德堆
    • 我还在用。如果您提供的文件位于该路径并且格式正确,它将起作用
    • 是的,它可以与在 dart VM (dart.io) 中工作的 Flutter native 或 dart native 一起正常工作。但它不适用于 Flutter web(dart.html) 。我们没有支持 dart web 的 SecurityContext 和 SecureSocket 类的类。有没有人有相同的解决方案
    • @SANU 如果 JavaScript 程序可以控制浏览器信任的证书,那将是一个巨大的安全漏洞。对于测试或内部使用,您可以安装证书 - 例如参见 peacocksoftware.com/blog/…。在生产中,您需要使用正确签名的证书。
    猜你喜欢
    • 2019-08-23
    • 2019-09-13
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多