我正在尝试使用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生成的文件。
谢谢您的帮助。
答案 0 :(得分:0)
通常,您不必向客户端添加任何内容即可允许客户端连接到正确配置的HTTPS服务器。希望服务器具有签名的服务器端证书。如果该证书是由信誉良好的CA签署的,则客户端应自动信任它。如果它是由内部CA签名的,或者是自签名的,则需要做一些工作。您需要向客户端提供签名证书。在前一种情况下,这将是根CA的证书。在后一种情况下,提供服务器的证书可能会起作用,尽管完全禁用客户端检查可能更容易。
正如您所发现的,签名证书可能采用CRT格式。您需要完全按照自己的方式提供。无需提供任何公钥,因为随服务器hello发送的证书中分发了公钥。
除非您要使用客户端证书,否则不需要提供私钥,因此可以跳过失败的步骤。无论如何,提供公钥肯定是行不通的。