Dart将SSL证书和密钥添加到HttpClient

时间:2019-05-24 22:07:24

标签: rest ssl https flutter dart

我正在尝试使用TLS / SSL保护REST API,为此,我需要更新客户端以使用公钥和证书。 客户端是用dart编写的,这是我实现SecurityContext的方式:

SecurityContext clientContext = SecurityContext.defaultContext;

var certificate = (await rootBundle.load("assets/ssl/coastr.crt")).buffer.asInt8List();
print(certificate.toString());
clientContext.setTrustedCertificatesBytes(certificate);

/*var authorities = (await rootBundle.load('assets/ssl/coastr.ca-bundle')).buffer.asUint8List();
print(authorities.toString());
clientContext.setClientAuthoritiesBytes(authorities);*/

var key = (await rootBundle.load("assets/ssl/coastr_public.key")).buffer.asInt8List();
print(key.toString());
clientContext.usePrivateKeyBytes(key);

HttpClient client = HttpClient(context: clientContext);

HttpClientRequest request = await client.getUrl(Uri.parse(url));

HttpClientResponse response = await request.close();

证书(.crt文件)被添加到clientContext中,没有问题,但是向其添加密钥返回此错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception:
TlsException: Failure in usePrivateKeyBytes (OS Error: 
BAD_PKCS12_DATA(pkcs8_x509.c:606)
passed a null parameter(ssl_privkey.cc:375), errno = 0)

我正在使用的文件是:

  • coastr.crt带有以下内容:----- BEGIN CERTIFICATE -----

  • coastr_public.key,带有标头:----- BEGIN公共密钥-----

我不知道是否向客户端提供了错误的文件,或者错误是否来自其他地方。 使用openssl生成的文件。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

通常,您不必向客户端添加任何内容即可允许客户端连接到正确配置的HTTPS服务器。希望服务器具有签名的服务器端证书。如果该证书是由信誉良好的CA签署的,则客户端应自动信任它。如果它是由内部CA签名的,或者是自签名的,则需要做一些工作。您需要向客户端提供签名证书。在前一种情况下,这将是根CA的证书。在后一种情况下,提供服务器的证书可能会起作用,尽管完全禁用客户端检查可能更容易。

正如您所发现的,签名证书可能采用CRT格式。您需要完全按照自己的方式提供。无需提供任何公钥,因为随服务器hello发送的证书中分发了公钥。

除非您要使用客户端证书,否则不需要提供私钥,因此可以跳过失败的步骤。无论如何,提供公钥肯定是行不通的。