Dart Добавить SSL-сертификат и ключ к HttpClient - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь защитить REST API, используя TLS / SSL, для этого мне нужно было обновить мой клиент для использования открытого ключа и сертификата.Клиент написан в 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 с этим заголовком: ----- НАЧАТЬ СЕРТИФИКАТ -----

  • coastr_public.key с заголовком: ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ -----

Понятия не имею, предоставляю ли янеправильные файлы для клиента или если ошибка приходит из другого места.Файлы, созданные с помощью openssl.

Спасибо за помощь.

1 Ответ

0 голосов
/ 25 мая 2019

В общем случае вам не нужно ничего добавлять к клиенту, чтобы он мог подключаться к правильно настроенному HTTPS-серверу.Надеюсь, сервер имеет подписанный сертификат на стороне сервера.Если этот сертификат подписан авторитетным центром сертификации, клиент должен автоматически ему доверять.Если он подписан внутренним центром сертификации или самоподписан, вам необходимо выполнить некоторую работу.Вам необходимо предоставить клиенту сертификат подписи.В первом случае это будет сертификат корневого ЦС.В последнем случае предоставление сертификата сервера может работать, хотя, вероятно, проще вообще отключить проверку клиента.

Сертификат подписи, вероятно, будет в форме CRT, как вы обнаружили.И вы должны предоставить это именно так, как вы делаете.Нет необходимости предоставлять какие-либо открытые ключи, так как они распространяются в сертификатах, отправленных с сервером hello.

Если вы не хотите использовать сертификат на стороне клиента, нет необходимости предоставлять закрытый ключ, поэтому вы можете пропуститьшаг, который терпит неудачу.И в любом случае предоставление открытого ключа для него определенно не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...