Flutter从资产文件夹添加自签名证书

我的服务器在调用其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)=> true;

回答:

从您的问题尚不清楚,自签名证书的作用是什么。根据您的解决方法,我认为这是您已安装在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);

以上是 Flutter从资产文件夹添加自签名证书 的全部内容, 来源链接: utcz.com/qa/418548.html

回到顶部