Добавление пользовательского протокола проверки c в dart: io HttpClient - PullRequest
2 голосов
/ 19 июня 2020

Я пытаюсь создать HttpClient , который может проверять сертификат SSL после каждого рукопожатия TLS и перед получением / отправкой любых других данных.

Таким образом, поток будет выглядеть следующим образом:

  1. Создать HttpClient
  2. Выполнить запрос
  3. Клиент подключается к хосту через HTTPS
  4. После того, как рукопожатие TLS было выполнено, клиент теперь знает сертификат
  5. Передать сертификат в обратный вызов. Выполнить фактический запрос, когда обратный вызов завершится успешно, в противном случае прервать запрос
  6. В случае, если обратный вызов был успешным, действуйте как обычно (например, передайте ответ et c.)

Я искал в SecurityContext уже. Проблема в том, что он проверяет только фиксированный набор сертификатов, но я хочу проверять сертификат динамически на основе сертификата, отправленного хостом. Кроме того, я увидел, что в HttpClient есть метод badCertificateCallback , но он не подходит для моего использования, поскольку я хочу проверять каждый сертификат, а не только недействительные / плохие.

I мне было интересно, могу ли я теоретически создать класс, который использует HttpClient в качестве суперкласса и, следовательно, изменить его поведение, но мне интересно, есть ли более элегантный способ, который не ломается так легко при изменении реализации HttpClient.

Другая моя идея - установить SecurityContext, который по умолчанию отклоняет каждый сертификат. Затем я мог бы использовать badCerificateCallback для выполнения проверок, обычно выполняемых SecurityContext (проверка по списку доверенных сертификатов), и добавить свою собственную проверку поверх этого. Кто-нибудь знает о каких-либо недостатках, которые у этого могут быть? Я немного сомневался, когда читал об ограничениях относительно iOS.

Кто-нибудь здесь делал подобные вещи раньше и мог бы мне подсказать? :)

Заранее спасибо!

1 Ответ

0 голосов
/ 07 сентября 2020

Для вашего варианта использования лучше иметь собственную версию BetterHttpClient.

Однако вместо BetterHttpClient наследования от HttpClient вы можете использовать композицию. Составьте HttpClient внутри BetterHttpClient. Это даст вам больше контроля над тем, что вы хотите использовать / обновить из существующей реализации, а также это будет лучше защищено от любых изменений, которые от HttpClient будут от go до

...